V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
hsluoyz
V2EX  ›  分享创造

Casbin: 强大的访问控制、权限管理框架,支持 ACL, RBAC, ABAC,支持所有主流编程语言

  •  
  •   hsluoyz · 2021-03-11 10:41:50 +08:00 · 2285 次点击
    这是一个创建于 1158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    casbin

    开发语言支持

    Go 语言版casbin、Java 语言版jcasbin

    Node 语言版node-casbin、php 语言版PHP-Casbin

    python 语言版PyCasbin、pascal 语言版Casbin4D

    Net 语言版Casbin-Net、Rust 语言版casbin-rs

    功能

    1.按照经典表单{subject, object, action},或自定义表单执行定义的策略,支持[允许]和[拒绝]两种授权。

    2.处理访问控制模型及其策略的存储。

    3.管理角色 - 用户映射和角色 - 角色映射( RBAC 的角色层级结构)。

    4.内置超级用户,如:root 、administrator 。超级用户默认能做任何事。

    5.内置多个操作符,支持规则匹配。如:keyMatch 将资源 /foo/bar 映射到 /foo*。

    不能做什么

    1.不负责身份验证。

    Casbin 不负责用户登录信息验证(用户登录时 username 、password 验证)。

    2.不负责管理用户或角色列表。

    Casbin 相信由项目自身管理这些实体会更方便。

    用户通常拥有自己的密码,而 Casbin 并非为密码容器而设计。Casbin 会存储 RBAC 方案的中用户与角色的映射。

    若确实需要 Casbin 验证和授权,可加入 Casbin,GO 语言编写的简单 API 网关

    依赖

    <dependency>
      <groupId>org.casbin</groupId>
      <artifactId>jcasbin</artifactId>
      <version>1.2.0</version>
    </dependency>

    安装方式详见Casbin 安装手册

    入门

    最新版的 Casbin 执行器,能直接读取模型文件和策略文件:

    import org.casbin.jcasbin.main.Enforcer;
    

    Enforcer enforcer = new Enforcer("path/to/model.conf", "path/to/policy.csv");

    也能够从数据库中读取数据。在访问前加入如下处理逻辑:

    String sub = "alice"; // the user that wants to access a resource.
    String obj = "data1"; // the resource that is going to be accessed.
    String act = "read"; // the operation that the user performs on the resource.
    

    if (enforcer.enforce(sub, obj, act) == true) { // permit alice to read data1 } else { // deny the request, show an error }

    除静态策略文件,Casbin 还提供运行时权限管理 API 。如,分配给用户的角色:

    Roles roles = enforcer.getRoles("alice");

    权限管理 API

    Casbin 权限管理 API 目前只支持 Go 语言和 Node.js 。

    具体参考Casbin 权限管理 API

    权限配置参考在线编辑工具

    多线程处理

    多线程方式使用 Casbin,可使用 Casbin enforcer 的同步包装类

    它支持 AutoLoad 功能,若发生变更,Casbin enforcer 自动从 DB 加载最新策略。

    StartAutoLoadPolicy():定期加载策略。

    StopAutoLoadPolicy():停止操作。

    管理界面

    casbin ui policy editor

    参见Casbin web-ui

    安全模型

    Casbin 支持多达 11 种的安全模型。

    具体配置参考Casbin 模型示例,稍后会列出支持的11 种安全控制模型

    模型语法

    Casbin CONF 模型包含四个部分:

    [request_definition]、[policy_definition]、[policy_effect]、[matchers]。

    使用 RBAC 模型,还需添加[role_definition]部分。

    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)) && !some(where (p.eft == deny))

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

    详情参见Casbin 模型语法

    日志处理

    Casbin 内置 log,默认启用日志记录。格式如下:

    2017/07/15 19:43:56 [Request: alice, data1, read ---> true] 

    使用 Enforcer.EnableLog()或 NewEnforcer()的最后一个参数切换它:

    // Disable the logging in the new method.
    e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv", false)
    

    // Enable the logging at run-time. e.EnableLog(true)

    详情参见Casbin 日志处理

    11 种安全模型

    ACL(访问控制列表)

    ACL 和超级用户

    没有用户的 ACL:对没有身份验证或用户登录的系统尤其有用。

    没有资源的 ACL:通过使用 write-article 、read-log 等权限。适用针对一种资源类型,而不是单个资源的场景。不控制对特定文章或日志的访问。

    RBAC:基于角色的访问控制

    具有资源角色的 RBAC:用户和资源能同时拥有角色(或组)。

    具有域 /租户的 RBAC:对于不同的域 /租户,用户可以拥有不同的角色集。

    基于属性的访问控制(ABAC):类似资源的语法糖。所有者可用于获取资源属性。

    RESTful:支持 /res/*、/res/:id 等路径和 GET 、POST 、PUT 、DELETE 等 HTTP 方法。

    拒绝覆盖(Deny-override):支持允许和拒绝授权,拒绝覆盖允许。

    优先级(Priority):策略规则像防火墙规则一样优先级化。

    工作原理

    以 Java 版 Casbin 为例,说明 Casbin 工作原理。

    在 jCasbin 中,访问控制模型基于 PERM 元模型(策略、效果、请求、匹配器)抽象的 CONF 文件。

    切换或升级项目的授权机制,如同修改配置一样简单。

    通过组合可用的模型,自定义个性化的访问控制模型。

    如:在一个模型中将 RBAC 角色和 ABAC 属性放在一起,并共享一组策略规则。

    ACL 模型

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

    示例中表示 alice 可以访问 data1,bob 可以对 data2 进行写操作。

    PERM 元模型

    PERM (策略、效果、请求、匹配器)的实例描述四种实体如何交互以完成授权。

    首先了解一下相关概念,再看一个示例模型。

    请求(Request)

    有关访问请求的信息。

    一个请求会包含一组 subject 、action 、resource 数据,r = {sub, action, resource}。逻辑实体构建于持久数据之上,就像 CRM 系统中的客户一样。

    策略( Policy )

    构成系统规则的模型,如:允许管理员读取用户信息

    p = {sub, action, resource}

    匹配器( Matchers )

    请求和策略如何匹配的模型。

    最简单的例子是使用等式匹配请求和策略。

    m = r.sub == p.sub && r.action == p.action && r.resource == p.resource

    效果( Effect )

    将组合或拆分的策略模型去请求得以一个最终结果。

    评估表达式的值可在每个策略的 eft 字段中找到。

    e = some(p.eft == allow)

    下图中演示了如何基于 PERM 模型作授权请求。

    perm

    ACL 授权模型定义

    [request_definition]
    r = sub, obj, act
    

    [policy_definition] p = sub, obj, act

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

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

    这种授权模型,定义授权规则的策略如下:

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

    允许 admin 用户访问所有内容的定义如下:

    [matchers]
    m = r.sub == admin || (r.sub == p.sub && r.obj == p.obj && r.act == p.act)

    启用基于简单属性的访问控制,访问 resource 对象中的数据。

    如果只允许资源所有者发起的请求,匹配器表达式将改为:

    m = r.obj.owner == r.sub && (r.sub == p.sub && r.obj == p.obj && r.act == p.act)
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1252 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:14 · PVG 07:14 · LAX 16:14 · JFK 19:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.