Rust:如何使用Polar权限管理

权限管理概念:

Finished browsing

权限管理 (Permission Management) 是一个涵盖了系统或网络中用户权限控制和管理的系统。它主要包括了以下几点:

  1. 权限定义:系统中的不同用户或者用户组具有不同的权限,以控制他们能够访问和操作的资源和数据。通俗来说,权限是指在某个组织中,某些人在某些事务上能够进行决策和执行的范围或程度 。
  2. 模块化管理:权限管理通常是系统管理的一个重要模块,它可能包含了多个子模块来处理不同的安全策略和角色设置。在这种模块化的设计中,IT管理员可以轻松地配置和管理用户权限
  3. 后台系统的重要组成部分:权限管理是所有后台系统的重要组成部分,它可以有效地控制不同的人访问资源,以及减少因权限控制缺失或操作不当引发的风险,例如操作错误和隐私数据泄露等问题
  4. 认证和授权:权限管理包括用户认证和授权两个主要环节。用户认证是验证用户身份的过程,而用户授权则是基于安全规则或策略控制用户可以访问并且只能访问自己被授权的资源 。

oso

Oso是一个用于构建应用程序授权的系统,它提供了一种名为Polar的声明性策略语言来定义授权模型。主要特点包括:

  1. 授权作为服务:Oso Cloud提供了一种授权作为服务的解决方案,它支持基本的角色基础访问控制 (RBAC)、关系基础访问控制 (ReBAC) 或属性基础访问控制 (ABAC),并且可以通过Polar进行扩展,以满足不同的授权模型需求 。
  2. 声明性策略语言:Oso通过一种名为Polar的声明性策略语言来定义授权模型,使得开发者可以灵活地表达授权逻辑 。
  3. 框架和库:Oso Library提供了一个包含了常见权限模式和关系的框架,使得开发者可以快速地在应用程序中构建授权模型。它提供了超出基本的是/否授权问题的过滤功能,以及可扩展的策略语言Polar来满足特定的需求 ,其中也包含了rust版本的oso库。
  4. 云授权 :Oso Cloud作为一种授权作为服务的解决方案,为构建和迭代应用程序中的授权提供了抽象,这基于与数百个工程团队多年的合作经验8

polar

Polar 是 Oso 提供的一种声明性政策语言,专门用于构建应用程序的授权模型。它允许开发者以一种高级、清晰且结构化的方式表达授权逻辑和规则。通过使用 Polar,开发者可以定义谁可以访问应用程序中的什么资源,并在什么条件下可以访问。但是在rust中有对应的oso库,所以在你的rust项目中,只在本地使用oso库进行权限管理的构建,也可以完全使用rust代码代替polar代码。

现在,让我们分解一下这里的两个主要概念:

  1. 声明性政策语言

    • 声明性:声明性编程是一种编程范式,它允许开发者表达他们想要达到的目的,而不是指定如何达到这个目的。换句话说,它关注"什么"而不是"怎样"。在声明性编程中,开发者声明他们想要的结果,而系统则负责确定如何实现这些结果。
    • 政策语言:政策语言是为特定目的而设计的编程语言,通常用于表达系统的行为或规则。在授权的场景中,政策语言可以用来定义谁可以访问什么资源,并在什么条件下可以访问。
  2. Polar

    • 高级语法:Polar 提供了一种高级的语法,使得开发者可以以直观和清晰的方式表达授权规则。
    • 集中管理:通过使用 Polar,开发者可以在一个集中的位置定义和管理所有的授权规则,使得授权逻辑易于维护和审计。
    • 灵活扩展:Polar 支持各种常见的授权模式,如角色基础访问控制 (RBAC) 和属性基础访问控制 (ABAC),同时也允许开发者根据他们的特定需求定制和扩展授权逻辑

通过这种方式,Polar 提供了一种强大而灵活的方法来构建和管理应用程序的授权模型,同时保持了高度的可读性和可维护性。

代码示例

在 Rust 中进行权限管理,你可以使用 Oso 库,它提供了一个叫做 Polar 的声明式策略语言来实现角色和权限的管理。下面是一个简单的例子来展示如何在 Rust 环境中使用 Polar 来编写和执行权限管理:

首先,你需要在你的 Cargo.toml 文件中添加 Oso 依赖:

ini 复制代码
[dependencies]
oso = "0.20.0"  # 使用最新的版本

然后你可以创建一个 main.rs 文件并输入以下代码:

rust 复制代码
extern crate oso;

use oso::Oso;

#[derive(Clone)]
struct Repository {
    name: String,
    permissions: Vec<String>,
}

#[derive(Clone)]
struct User {
    name: String,
    role: String,
}

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

    // 注册 Rust 结构
    oso.register_class(
        oso::Class::builder::<Repository>()
            .name("Repository")
            .add_attribute_getter("permissions", |receiver: &Repository| {
                receiver.permissions.clone()
            })
            .build(),
    )?;
    oso.register_class(
        oso::Class::builder::<User>()
            .name("User")
            .add_attribute_getter("role", |receiver: &User| receiver.role.clone())
            .build(),
    )?;

    // 加载 Polar 策略
    oso.load_str(
        r#"
        allow(user: User, action: String, repository: Repository) if
            action in repository.permissions and
            (user.role = "admin" or user.role = "maintainer");
    "#,
    )?;

    // 创建 User 和 Repository 实例
    let user = User {
        name: String::from("Alice"),
        role: String::from("admin"),
    };
    let repo = Repository {
        name: String::from("my-repo"),
        permissions: vec![String::from("read"), String::from("write")],
    };

    // 检查权限
    assert!(oso.is_allowed(user.clone(), "read", repo.clone())?);
    assert!(oso.is_allowed(user.clone(), "write", repo.clone())?);
    assert!(!oso.is_allowed(user.clone(), "delete", repo.clone())?);

    println!("Permission checks passed.");
    Ok(())
}

在这个例子中,我们首先创建了一个 Oso 实例,并注册了两个 Rust 结构 UserRepository 使得 Polar 策略可以访问它们的属性。然后我们加载了一个简单的 Polar 策略,该策略允许 adminmaintainer 角色的用户在 repository 上执行任何允许的操作。最后,我们创建了 UserRepository 实例,并使用 oso.is_allowed 方法来检查用户是否有权限执行特定的操作。

权限管理通常有哪些管理权限?

在一个Web服务中,资源的权限通常可以分为以下几类,具体的权限可能会根据不同的应用或服务有所不同:

  1. 读取权限 (Read) :

    • 用户可以查看或读取资源的信息。
    • 示例:查看文章、读取文件、浏览商品列表。
  2. 写入权限 (Write) :

    • 用户可以修改或更新资源的信息。
    • 示例:编辑文章、上传文件、修改商品信息。
  3. 创建权限 (Create) :

    • 用户可以创建新的资源实例。
    • 示例:发布新文章、创建新账户、添加新商品。
  4. 删除权限 (Delete) :

    • 用户可以删除资源。
    • 示例:删除文章、删除账户、移除商品。
  5. 管理权限 (Manage) :

    • 用户可以管理资源的设置和配置。
    • 示例:设置权限、配置资源的属性。
  6. 执行权限 (Execute) :

    • 用户可以执行特定的操作或命令。
    • 示例:运行脚本、执行任务。
  7. 审核权限 (Audit) :

    • 用户可以查看资源的历史记录和日志,进行安全和合规性审核。
    • 示例:查看修改历史、审查操作日志。
  8. 授权权限 (Grant/Revoke) :

    • 用户可以为其他用户分配或撤销权限。
    • 示例:分配角色、更改用户权限。

常见的用户角色属性

在一个web服务中,通常会有多种角色来确保系统的正常运作和安全。以下是一些常见的角色及其职责:

  1. 管理员 (Administrator) :

    • 负责整个系统的设置、配置和维护。
    • 管理用户账户和权限。
    • 监控系统性能和安全。
    • 处理系统中的问题和故障。
  2. 维护人员 (Maintainer) :

    • 负责代码的更新和维护。
    • 解决用户反馈的问题。
    • 更新和维护系统文档。
  3. 贡献者 (Contributor) :

    • 提供代码或内容贡献。
    • 参与项目讨论和代码审查。
  4. 用户 (User) :

    • 使用web服务的功能。
    • 提供反馈和报告问题。
  5. 审核员 (Auditor) :

    • 审核系统的安全和合规性。
    • 检查和评估系统的风险。
  6. 客服和支持人员 (Customer Service and Support) :

    • 提供用户支持和帮助。
    • 解答用户的问题和疑虑。
  7. 运营人员 (Operator) :

    • 负责网站的日常运营和推广。
    • 分析用户数据和市场趋势。
  8. 测试员 (Tester) :

    • 测试系统的功能和性能。
    • 报告和跟踪bug。
  9. 数据分析师 (Data Analyst) :

    • 分析用户数据和系统性能数据。
    • 提供数据支持和报告。
  10. 项目经理 (Project Manager) :

    • 确保项目按计划进行。
    • 协调团队成员和资源。

根据上面的角色属性分配他们相应的权限的polar代码

在这个 policy.polar 文件中,我们为每个角色定义了不同的权限。例如,我们允许 Administrator 角色执行 read, write, create, delete, manage, 和 grant 操作,而 Auditor 角色只能执行 audit 操作

ini 复制代码
allow(user: User, action: String, repository: Repository) if
    action in repository.permissions and (
        (user.role = "Administrator" and (action = "read" or action = "write" or action = "create" or action = "delete" or action = "manage" or action = "grant")) or
        (user.role = "Maintainer" and (action = "read" or action = "write" or action = "create" or action = "manage")) or
        (user.role = "Contributor" and (action = "read" or action = "write" or action = "create")) or
        (user.role = "Auditor" and action = "audit") or
        (user.role = "Operator" and (action = "read" or action = "write" or action = "execute")) or
        (user.role = "Tester" and (action = "read" or action = "write")) or
        (user.role = "DataAnalyst" and action = "read") or
        (user.role = "ProjectManager" and (action = "read" or action = "write" or action = "create" or action = "manage"))
    );

上面的polar文件也可以通过以下方式读取到rust程序中:

rust 复制代码
use std::path::Path;

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

   // 获取 Cargo manifest 文件的目录
   let manifest_dir = env!("CARGO_MANIFEST_DIR");

   // 构建 policy.polar 文件的路径
   let policy_path = format!("{}/src/policy.polar", manifest_dir);

   // 加载 policy.polar 文件
   oso.load_files(vec![Path::new(&policy_path)])?;

   Ok(())
}

以上就是在rust中如何使用oso权限管理工具包以及Polar的例子。from刘金,转载请注明原文链接。感谢!

相关推荐
捂月35 分钟前
Spring Boot 核心逻辑与工作原理详解
java·spring boot·后端
Nightselfhurt1 小时前
RPC学习
java·spring boot·后端·spring·rpc
Estar.Lee8 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_857610039 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_10 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞10 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货10 小时前
Rust 的简介
开发语言·后端·rust
AskHarries10 小时前
如何将Spring Cloud Task发布Data Flow上执行?
java·后端·spring cloud
qq_1728055910 小时前
RUST学习教程-安装教程
开发语言·学习·rust·安装
monkey_meng11 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust