Rust插件库polar-core的使用,polar-core提供高效的数据处理与核心功能扩展

Rust插件库polar-core的使用,polar-core提供高效的数据处理与核心功能扩展

polar-core是Oso框架的Rust核心组件,主要用于构建应用程序的授权系统。它提供了高效的数据处理和核心功能扩展能力。

主要功能

polar-core允许您:

  • 建模:使用内置原语设置常见的权限模式(如基于角色的访问控制RBAC)和关系
  • 过滤:实现集合授权,例如"只显示Juno可以查看的记录"
  • 测试:为授权逻辑编写单元测试,使用Oso调试器或REPL跟踪意外行为

安装

在项目目录中运行以下Cargo命令:

cargo add polar-core

或者在Cargo.toml中添加以下行:

polar-core = "0.27.3"

示例代码

以下是使用polar-core的基本示例:

use polar_core::Polar;
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建Polar实例
    let mut polar = Polar::new();

    // 加载策略
    polar.load_str(r#"
        actor User { "name": String }
        resource Repository {
            permissions = ["read", "push"];
            roles = ["contributor", "maintainer"];
            
            "read" if "contributor";
            "push" if "maintainer";
        }
        
        has_role(user: User, "contributor", repo: Repository) if
            user.name = "alice";
    "#)?;

    // 定义用户和资源
    let user = json!({"name": "alice"});
    let repo = json!({"name": "oso"});

    // 检查授权
    let allowed = polar.query_rule(
        "allow", 
        vec![user, "read", repo]
    )?;

    println!("Authorization result: {:?}", allowed);

    Ok(())
}

完整示例demo

以下是一个更完整的polar-core使用示例,展示了如何构建一个完整的基于角色的访问控制系统:

use polar_core::Polar;
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化Polar实例
    let mut polar = Polar::new();
    
    // 加载授权策略
    polar.load_str(r#"
        // 定义用户类型
        actor User {
            name: String,
            department: String
        }
        
        // 定义文档资源
        resource Document {
            permissions = ["view", "edit", "delete"];
            roles = ["reader", "editor", "admin"];
            
            // 权限规则
            "view" if "reader";
            "edit" if "editor";
            "delete" if "admin";
            
            // 部门限制
            "view" if user.department = doc.department;
        }
        
        // 角色分配规则
        has_role(user: User, "reader", doc: Document) if
            user.name = "jane";
            
        has_role(user: User, "editor", doc: Document) if
            user.name = "john";
            
        has_role(user: User, "admin", doc: Document) if
            user.name = "admin";
    "#)?;

    // 创建测试用户
    let jane = json!({"name": "jane", "department": "engineering"});
    let john = json!({"name": "john", "department": "marketing"});
    let admin = json!({"name": "admin", "department": "management"});
    
    // 创建测试文档
    let eng_doc = json!({"title": "工程文档", "department": "engineering"});
    let mkt_doc = json!({"title": "营销文档", "department": "marketing"});
    let all_doc = json!({"title": "公司文档", "department": "all"});

    // 测试授权
    println!("Jane可以查看工程文档: {:?}", 
        polar.query_rule("allow", vec![jane.clone(), "view", eng_doc.clone()])?);
    
    println!("John可以编辑营销文档: {:?}", 
        polar.query_rule("allow", vec![john.clone(), "edit", mkt_doc.clone()])?);
    
    println!("Admin可以删除任何文档: {:?}", 
        polar.query_rule("allow", vec![admin.clone(), "delete", all_doc.clone()])?);

    Ok(())
}

技术细节

  • polar-core需要Rust 1.46+版本
  • 开发基于Rust的最新稳定版本
  • 采用Apache-2.0许可证

社区支持

Oso团队在Slack社区提供支持,可以加入#help频道获取帮助。

注意:Oso团队已宣布弃用旧版Oso开源库,但将继续提供关键错误修复和支持。


1 回复

以下是根据您提供的内容整理的完整示例demo:

基础数据处理完整示例

use polar_core::data::{DataFrame, Series};

fn main() {
    // 创建两个Series
    let names = Series::new("names", vec!["Alice", "Bob", "Charlie"]);
    let scores = Series::new("scores", vec![85, 92, 78]);
    
    // 创建DataFrame并添加Series
    let mut df = DataFrame::new();
    df.add_column(names);
    df.add_column(scores);
    
    // 打印整个DataFrame
    println!("完整数据:");
    println!("{:?}", df);
    
    // 获取特定列
    if let Some(scores) = df.get_column("scores") {
        println!("分数列: {:?}", scores);
    }
}

扩展功能完整示例

use polar_core::extension::{Extension, ExtensionRegistry};
use polar_core::data::{DataFrame, Series};

// 自定义扩展:分数标准化
struct NormalizeExtension;

impl Extension for NormalizeExtension {
    fn name(&self) -> &str {
        "normalize"
    }
    
    fn process(&self, data: &mut DataFrame) {
        if let Some(scores) = data.get_column("scores") {
            // 计算最大值
            let max = scores.iter()
                .map(|v| v.as_i32().unwrap())
                .max()
                .unwrap_or(1) as f32;
            
            // 创建标准化后的分数列
            let normalized: Vec<f32> = scores.iter()
                .map(|v| v.as_i32().unwrap() as f32 / max)
                .collect();
            
            data.add_column(Series::new("normalized", normalized));
        }
    }
}

fn main() {
    // 创建扩展注册表并注册扩展
    let mut registry = ExtensionRegistry::new();
    registry.register(Box::new(NormalizeExtension));
    
    // 准备数据
    let mut df = DataFrame::new();
    df.add_column(Series::new("scores", vec![50, 80, 100]));
    
    // 应用扩展
    registry.process("normalize", &mut df);
    
    // 打印结果
    println!("标准化后的分数:");
    println!("{:?}", df.get_column("normalized"));
}

线程安全完整示例

use polar_core::data::DataFrame;
use std::sync::Arc;
use std::thread;

fn main() {
    // 创建共享DataFrame
    let df = Arc::new({
        let mut df = DataFrame::new();
        df.add_column(Series::new("data", vec![1, 2, 3, 4, 5]));
        df
    });
    
    // 创建4个线程处理数据
    let handles: Vec<_> = (0..4).map(|i| {
        let df = Arc::clone(&df);
        thread::spawn(move || {
            // 模拟数据处理
            println!("线程 {} 开始处理", i);
            if let Some(col) = df.get_column("data") {
                let sum: i32 = col.iter().map(|v| v.as_i32().unwrap()).sum();
                println!("线程 {} 计算结果: {}", i, sum);
            }
        })
    }).collect();
    
    // 等待所有线程完成
    for handle in handles {
        handle.join().unwrap();
    }
}

性能优化完整示例

use polar_core::data::{DataFrame, Series};
use polar_core::ops::{filter, transform};

fn main() {
    // 1. 预分配DataFrame
    let mut df = DataFrame::with_capacity(1000);
    
    // 2. 批量添加数据
    let values: Vec<i32> = (0..1000).collect();
    df.add_column(Series::new("values", values));
    
    // 3. 使用零拷贝转换
    transform(&mut df, |data| {
        // 对每个元素乘以2
        if let Some(col) = data.get_column_mut("values") {
            for v in col.iter_mut() {
                *v = v.as_i32().unwrap() * 2;
            }
        }
    });
    
    // 4. 批量过滤数据
    let filtered = filter(&df, "values", |val: &i32| *val > 1500);
    
    println!("过滤后的数据量: {}", filtered.len());
}

自定义扩展完整示例

use polar_core::extension::{Extension, ExtensionRegistry};
use polar_core::data::{DataFrame, Series};

// 自定义统计扩展
struct StatsExtension;

impl Extension for StatsExtension {
    fn name(&self) -> &str {
        "stats"
    }
    
    fn process(&self, data: &mut DataFrame) {
        if let Some(col) = data.get_column("values") {
            let values: Vec<i32> = col.iter()
                .map(|v| v.as_i32().unwrap())
                .collect();
            
            let sum: i32 = values.iter().sum();
            let avg = sum as f32 / values.len() as f32;
            let min = *values.iter().min().unwrap();
            let max = *values.iter().max().unwrap();
            
            // 添加统计结果
            data.add_column(Series::new("sum", vec![sum]));
            data.add_column(Series::new("avg", vec![avg]));
            data.add_column(Series::new("min", vec![min]));
            data.add_column(Series::new("max", vec![max]));
        }
    }
}

fn main() {
    // 初始化扩展系统
    let mut registry = ExtensionRegistry::new();
    registry.register(Box::new(StatsExtension));
    
    // 准备测试数据
    let mut df = DataFrame::new();
    df.add_column(Series::new("values", vec![10, 20, 30, 40, 50]));
    
    // 应用统计扩展
    registry.process("stats", &mut df);
    
    // 打印统计结果
    println!("总和: {:?}", df.get_column("sum"));
    println!("平均值: {:?}", df.get_column("avg"));
    println!("最小值: {:?}", df.get_column("min"));
    println!("最大值: {:?}", df.get_column("max"));
}
回到顶部