#rbac #acl #authorization #abac #pattern-matching #logging

casbin

支持像ACL、RBAC、ABAC这样的访问控制模型的授权库

52个版本 (17个稳定版)

2.2.0 2024年2月2日
2.1.0 2023年12月2日
2.0.9 2021年8月23日
2.0.7 2021年4月7日
0.1.1 2019年12月31日

#7身份验证

Download history 3101/week @ 2024-04-22 2976/week @ 2024-04-29 3696/week @ 2024-05-06 3334/week @ 2024-05-13 3113/week @ 2024-05-20 3128/week @ 2024-05-27 4421/week @ 2024-06-03 4471/week @ 2024-06-10 3595/week @ 2024-06-17 4494/week @ 2024-06-24 3751/week @ 2024-07-01 5090/week @ 2024-07-08 3889/week @ 2024-07-15 3439/week @ 2024-07-22 4635/week @ 2024-07-29 5687/week @ 2024-08-05

每月下载 17,897次
19 crates 中使用

Apache-2.0

305KB
8K SLoC

casbin-rs

GitHub last commit Crates.io crates.io Docs CI Codecov Discord forum

💖 正在寻找像Okta、Auth0、Keycloak这样的开源身份和访问管理解决方案?了解更多关于:Casdoor

casdoor

新闻:还在担心如何编写正确的Casbin策略吗?Casbin在线编辑器即将到来,帮你解决问题!试试看:https://casbin.org/editor/

casbin Logo

Casbin-RS 是一个功能强大且高效的Rust项目开源访问控制库。它提供了根据各种 访问控制模型 进行授权的支持。

Casbin支持的所有语言

golang java nodejs php
Casbin jCasbin node-Casbin PHP-Casbin
生产就绪 生产就绪 生产就绪 生产就绪
python dotnet c++ rust
PyCasbin Casbin.NET Casbin-CPP Casbin-RS
生产就绪 生产就绪 生产就绪 生产就绪

安装

将此包添加到您的项目的Cargo.toml文件中。(检查https://crates.io/crates/casbin以获取正确版本)

[dependencies]
casbin = { version = "2.2.0", default-features = false, features = ["runtime-async-std", "logging", "incremental"] }
tokio = { version = "1.10.0", features = ["fs", "io-util"] }

警告:从casbin v2 0 6开始支持tokio v1 0或更高版本,我们建议您升级相关组件以确保它们正常工作。支持最后一个版本tokio v0 2的版本是casbin v2 0 5,您可以根据需要选择。

入门

  1. 使用模型文件和策略文件创建一个新的Casbin执行器

use casbin::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    let mut e = Enforcer::new("examples/rbac_with_domains_model.conf", "examples/rbac_with_domains_policy.csv").await?;
    e.enable_log(true);

    e.enforce(("alice", "domain1", "data1", "read"))?;
    Ok(())
}
  1. 在访问发生之前将执行钩子添加到您的代码中

    let sub = "alice"; // the user that wants to access a resource.
    let obj = "data1"; // the resource that is going to be accessed.
    let act = "read"; // the operation that the user performs on the resource.
    
    if let Ok(authorized) = e.enforce((sub, obj, act)) {
        if authorized {
            // permit alice to read data1
        } else {
            // deny the request
        }
    } else {
        // error occurs
    }
    

💡请注意,Enforcer 实例不是线程安全的,因此在使用可能由多个线程访问的环境中,您必须使用RwLock等方式来保护它,如下所示:let e = Arc::new(RwLock::new(e));.

目录

支持模型

  1. ACL(访问控制列表)
  2. 具有超级用户的ACL
  3. 无用户ACL:特别适用于没有身份验证或用户登录的系统。
  4. 无资源ACL:某些场景可能通过使用“write-article”、“read-log”等权限来针对资源类型,而不是单个资源。它不控制对特定文章或日志的访问。
  5. RBAC(基于角色的访问控制)
  6. 具有资源角色的RBAC:用户和资源可以同时拥有角色(或组)。
  7. 具有域/租户的RBAC:用户可以为不同的域/租户拥有不同的角色集。
  8. ABAC(基于属性的访问控制):可以使用如resource.Owner这样的语法糖来获取资源的属性。
  9. RESTful:支持如/res/*/res/:id这样的路径和HTTP方法如GETPOSTPUTDELETE
  10. 拒绝覆盖:支持允许和拒绝授权,拒绝覆盖允许。
  11. 优先级:策略规则可以像防火墙规则一样进行优先级排序。

它是如何工作的?

在casbin-rs中,访问控制模型被抽象为一个基于PERM元模型(策略、效果、请求、匹配器)的CONF文件。因此,切换或升级项目的授权机制就像修改配置一样简单。您可以通过组合可用的模型来自定义自己的访问控制模型。例如,您可以在一个模型中将RBAC角色和ABAC属性结合在一起,并共享一组策略规则。

casbin-rs中最基本和最简单的模型是ACL。ACL的模型CONF如下

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

ACL模型的示例策略如下

p, alice, data1, read
p, bob, data2, write

这意味着

  • alice可以读取data1
  • bob可以写入data2

功能

casbin-rs能做什么

  1. 以经典{subject, object, action}形式或您定义的自定义形式强制策略,支持允许和拒绝授权。
  2. 处理访问控制模型及其策略的存储。
  3. 管理角色-用户映射和角色-角色映射(即RBAC中的角色层次结构)。
  4. 支持内置超级用户,如rootadministrator。超级用户可以无权限执行任何操作。
  5. 提供多个内置运算符以支持规则匹配。例如,keyMatch可以将资源键/foo/bar映射到模式/foo*

casbin-rs不能做什么

  1. 身份验证(即在用户登录时验证usernamepassword
  2. 管理用户或角色列表。我认为对项目本身来说,管理这些实体更加方便。用户通常有自己的密码,而casbin-rs并不是设计为密码容器。然而,casbin-rs为RBAC场景存储用户-角色映射。

文档

https://casbin.org/docs/overview

在线编辑器

您还可以使用在线编辑器(http://casbin.org/editor/)在您的网页浏览器中编写casbin-rs模型和政策。它提供了类似于编程语言IDE的功能,如语法高亮代码补全

教程

https://casbin.org/docs/tutorials

策略管理

casbin-rs提供了两套API来管理权限

  • 管理API:提供对casbin-rs策略管理全面支持的原始API。示例请见这里
  • RBAC API:一个更友好的RBAC API。此API是管理API的一个子集。RBAC用户可以使用此API简化代码。示例请见这里

我们还提供基于Web的模型管理和策略管理UI

model editor

policy editor

策略持久化

角色管理器

https://casbin.org/docs/role-managers

示例

模型 模型文件 策略文件
ACL basic_model.conf basic_policy.csv
包含超级用户的ACL basic_model_with_root.conf basic_policy.csv
不包含用户的ACL basic_model_without_users.conf basic_policy_without_users.csv
不包含资源的ACL basic_model_without_resources.conf basic_policy_without_resources.csv
RBAC rbac_model.conf rbac_policy.csv
包含资源角色的RBAC rbac_model_with_resource_roles.conf rbac_policy_with_resource_roles.csv
包含域/租户的RBAC rbac_model_with_domains.conf rbac_policy_with_domains.csv
ABAC abac_model.conf N/A
RESTful keymatch_model.conf keymatch_policy.csv
拒绝覆盖 rbac_model_with_deny.conf rbac_policy_with_deny.csv
优先级 priority_model.conf priority_policy.csv

中间件

为Web框架提供的Authz中间件:https://casbin.org/docs/middlewares

我们的采用者

https://casbin.org/docs/adopters

贡献者

本项目得以存在,归功于所有贡献者。请见

赞助者

感谢所有赞助者!🙏 [成为赞助者]

赞助商

通过成为赞助商来支持此项目。您的标志将显示在此处,并带有指向您网站的链接。[成为赞助商]

许可

本项目采用Apache 2.0许可证

联系方式

如果您有任何问题或功能请求,请与我们联系。欢迎提交PR。

依赖项

~8–21MB
~288K SLoC