Rust权限管理库jurisdiction的使用,高效实现用户权限控制与访问管理

Rust权限管理库jurisdiction的使用,高效实现用户权限控制与访问管理

Jurisdiction

轻量级静态Jurisdiction信息。

该crate提供与世界各地司法管辖区相关的接口。一个司法管辖区(jurisdiction)的信息包括:

  • ISO 3166 Alpha2和Alpha3字符代码
  • ISO 3166数字国家代码
  • UN M49区域分类

Jurisdiction对象是一个轻量级对象,指针大小,适合在整个生态系统的API表面传输。在API边界上的序列化可以选择使用任何标准化的分类格式。

示例

use anyhow::{Result, anyhow, format_err};
use jurisdiction::{Jurisdiction, Alpha2, Alpha3};
use jurisdiction::region::{Region, SubRegion};
use std::str::FromStr;

fn supported_jurisdiction(alpha: &str) -> Result<Jurisdiction> {
    let jurisdiction = Jurisdiction::from_str(alpha)?;
    match jurisdiction.alpha2() {
        Alpha2::NO | Alpha2::SE | Alpha2::DK => Ok(jurisdiction),
        _ => Err(format_err!("only scandinavian countries are supported")),
    }
}

fn main() {
    let jurisdiction = supported_jurisdiction("NO").expect("unsupported");

    assert_eq!(jurisdiction, Alpha2::NO);
    assert_eq!(jurisdiction.alpha2(), Alpha2::NO);
    assert_eq!(jurisdiction.alpha2().to_string(), "NO");

    assert_eq!(jurisdiction, Alpha3::NOR);
    assert_eq!(jurisdiction.alpha3(), Alpha3::NOR);
    assert_eq!(jurisdiction.alpha3().to_string(), "NOR");

    assert_eq!(jurisdiction.country_code(), 578);

    assert_eq!(jurisdiction.region(), Region::Europe);
    assert_eq!(jurisdiction.sub_region(), SubRegion::NorthernEurope);
}

完整示例代码

以下是使用jurisdiction库实现用户权限控制与访问管理的完整示例:

use jurisdiction::{Jurisdiction, Alpha2};
use std::collections::HashMap;
use std::str::FromStr;

// 定义用户权限结构
struct UserPermissions {
    allowed_countries: Vec<Alpha2>,
    permissions: HashMap<String, bool>,
}

impl UserPermissions {
    fn new(countries: Vec<Alpha2>) -> Self {
        UserPermissions {
            allowed_countries: countries,
            permissions: HashMap::new(),
        }
    }

    // 检查用户是否有权限访问特定国家
    fn has_country_access(&self, country_code: &str) -> bool {
        let jurisdiction = Jurisdiction::from_str(country_code).unwrap();
        self.allowed_countries.contains(&jurisdiction.alpha2())
    }

    // 添加特定权限
    fn add_permission(&mut self, name: &str, value: bool) {
        self.permissions.insert(name.to_string(), value);
    }

    // 检查特定权限
    fn has_permission(&self, name: &str) -> bool {
        *self.permissions.get(name).unwrap_or(&false)
    }
}

fn main() {
    // 创建用户权限配置
    let mut user_perms = UserPermissions::new(vec![Alpha2::NO, Alpha2::US, Alpha2::JP]);
    
    // 添加额外权限
    user_perms.add_permission("edit_content", true);
    user_perms.add_permission("delete_content", false);
    user_perms.add_permission("view_reports", true);

    // 测试国家访问权限
    println!("Can access Norway: {}", user_perms.has_country_access("NO"));
    println!("Can access China: {}", user_perms.has_country_access("CN"));
    println!("Can access Japan: {}", user_perms.has_country_access("JP"));

    // 测试功能权限
    println!("Can edit content: {}", user_perms.has_permission("edit_content"));
    println!("Can delete content: {}", user_perms.has_permission("delete_content"));
    println!("Can view reports: {}", user_perms.has_permission("view_reports"));
}

安装

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

cargo add jurisdiction

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

jurisdiction = "0.1.1"

特性

  • 轻量高效:Jurisdiction对象仅指针大小
  • 标准化支持:使用ISO 3166和UN M49标准
  • 易于集成:与Rust生态系统无缝集成
  • 类型安全:利用Rust的类型系统确保代码安全

适用场景

  • 多地区服务的访问控制
  • 基于地理位置的内容过滤
  • 国际合规性检查
  • 区域化功能开关

1 回复

Rust权限管理库jurisdiction的使用指南

简介

jurisdiction是一个高效的Rust权限管理和访问控制库,提供简单而强大的用户权限控制和访问管理功能。特别适合需要细粒度权限控制的应用,如Web服务、企业应用等。

主要特性

  • 基于角色的访问控制(RBAC)
  • 权限继承和组合
  • 高效的内存使用和查询性能
  • 线程安全设计
  • 简洁的API接口

安装

在Cargo.toml中添加依赖:

[dependencies]
jurisdiction = "0.3"

基本使用方法

1. 创建权限系统

use jurisdiction::{PermissionSystem, Permission, Role};

// 创建权限系统实例
let mut system = PermissionSystem::new();

// 定义基本权限
let read_permission = Permission::new("read");
let write_permission = Permission::new("write");
let delete_permission = Permission::new("delete");

// 添加权限到系统
system.add_permission(read_permission);
system.add_permission(write_permission);
system.add_permission(delete_permission);

// 定义角色并分配权限
let user_role = Role::new("user")
    .with_permission("read");
    
let admin_role = Role::new("admin")
    .with_permission("read")
    .with_permission("write")
    .with_permission("delete");

// 添加角色到系统
system.add_role(user_role);
system.add_role(admin_role);

2. 用户权限检查

// 为用户分配角色
system.assign_role("user1", "user");
system.assign_role("admin1", "admin");

// 检查用户权限
assert!(system.has_permission("admin1", "write"));  // admin有write权限
assert!(!system.has_permission("user1", "write"));  // user没有write权限

3. 权限继承

// 创建继承user角色的moderator角色
let moderator_role = Role::new("moderator")
    .with_permission("write")
    .inherits_from("user");  // 继承user角色的所有权限

// 添加角色并分配用户
system.add_role(moderator_role);
system.assign_role("mod1", "moderator");

// 验证继承的权限
assert!(system.has_permission("mod1", "read"));   // 继承自user
assert!(system.has_permission("mod1", "write"));  // 自身权限

高级用法

1. 自定义权限检查器

use jurisdiction::{PermissionChecker, PermissionSystem, PermissionResult};

// 自定义权限检查器
struct TimeBasedChecker;
impl PermissionChecker for TimeBasedChecker {
    fn check(&self, permission: &str, context: &dyn std::any::Any) -> PermissionResult {
        if permission == "special_access" {
            // 检查上下文中的时间
            if let Some(time) = context.downcast_ref::<u32>() {
                if *time > 8 && *time < 18 {
                    return PermissionResult::Allow;  // 工作时间允许访问
                }
            }
            PermissionResult::Deny  // 非工作时间拒绝
        } else {
            PermissionResult::Defer  // 其他权限由系统处理
        }
    }
}

// 使用自定义检查器创建系统
let mut system = PermissionSystem::with_checker(TimeBasedChecker);

// 添加测试权限和角色...

// 测试自定义检查器
let current_hour: u32 = 14;  // 下午2点
assert!(system.check_with_context("user1", "special_access", &current_hour).is_allowed());

2. 权限组

// 创建内容管理权限组
let content_permissions = vec!["content.read", "content.write", "content.delete"];
system.create_permission_group("content", content_permissions);

// 创建editor角色并分配整个权限组
let editor_role = Role::new("editor")
    .with_permission_group("content");
    
// 添加角色并分配用户
system.add_role(editor_role);
system.assign_role("editor1", "editor");

// 验证权限组中的权限
assert!(system.has_permission("editor1", "content.write"));  // 权限组中的权限

实际应用示例

Web应用中的权限中间件

use jurisdiction::{PermissionSystem, PermissionMiddleware};
use actix_web::{web, App, HttpServer, HttpResponse};

// 管理后台页面
async fn admin_dashboard() -> HttpResponse {
    HttpResponse::Ok().body("Admin Dashboard")
}

// 用户个人资料页面
async fn user_profile() -> HttpResponse {
    HttpResponse::Ok().body("User Profile")
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    // 初始化权限系统
    let mut system = PermissionSystem::new();
    
    // 添加管理面板查看权限
    system.add_permission("view_admin_panel".into());
    
    // 定义admin角色
    system.add_role(Role::new("admin").with_permission("view_admin_panel"));
    
    // 模拟用户角色分配
    system.assign_role("user1", "user");
    system.assign_role("admin1", "admin");
    
    // 启动Web服务器
    HttpServer::new(move || {
        App::new()
            // 共享权限系统
            .app_data(web::Data::new(system.clone()))
            // 受保护的管理路由
            .service(
                web::resource("/admin")
                    .wrap(PermissionMiddleware::new("view_admin_panel"))
                    .to(admin_dashboard)
            )
            // 公开的用户路由
            .service(
                web::resource("/profile")
                    .to(user_profile)
            )
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

性能建议

  1. 大型系统使用PermissionSystem::with_capacity预分配空间
  2. 缓存频繁检查的权限结果
  3. 使用权限组减少内存使用

完整示例

以下是一个完整的博客系统权限管理示例:

use jurisdiction::{PermissionSystem, Permission, Role};

fn main() {
    // 初始化权限系统
    let mut system = PermissionSystem::new();

    // 1. 定义权限
    // 文章相关权限
    system.add_permission(Permission::new("article:read"));
    system.add_permission(Permission::new("article:create"));
    system.add_permission(Permission::new("article:edit"));
    system.add_permission(Permission::new("article:delete"));
    
    // 评论相关权限
    system.add_permission(Permission::new("comment:create"));
    system.add_permission(Permission::new("comment:delete"));
    
    // 管理权限
    system.add_permission(Permission::new("admin:dashboard"));
    system.add_permission(Permission::new("user:ban"));

    // 2. 定义角色
    // 访客角色
    system.add_role(
        Role::new("guest")
            .with_permission("article:read")
    );
    
    // 普通用户角色
    system.add_role(
        Role::new("user")
            .inherits_from("guest")  // 继承访客权限
            .with_permission("article:create")
            .with_permission("comment:create")
    );
    
    // 编辑角色
    system.add_role(
        Role::new("editor")
            .inherits_from("user")  // 继承用户权限
            .with_permission("article:edit")
    );
    
    // 管理员角色
    system.add_role(
        Role::new("admin")
            .inherits_from("editor")  // 继承编辑权限
            .with_permission("article:delete")
            .with_permission("comment:delete")
            .with_permission("admin:dashboard")
            .with_permission("user:ban")
    );

    // 3. 分配角色给用户
    system.assign_role("alice", "guest");
    system.assign_role("bob", "user");
    system.assign_role("charlie", "editor");
    system.assign_role("dave", "admin");

    // 4. 权限检查
    println!("Alice can read articles: {}", 
        system.has_permission("alice", "article:read"));
    println!("Bob can create comments: {}", 
        system.has_permission("bob", "comment:create"));
    println!("Charlie can edit articles: {}", 
        system.has_permission("charlie", "article:edit"));
    println!("Dave can access admin dashboard: {}", 
        system.has_permission("dave", "admin:dashboard"));
    
    // 5. 权限继承验证
    println!("Dave inherits article:read: {}", 
        system.has_permission("dave", "article:read"));
}

总结

jurisdiction库提供了一套完整而灵活的权限管理解决方案,通过简洁的API和高效的设计,使得在Rust应用中实现复杂的权限控制变得简单。

回到顶部