Casbin

Casbin

  • 文档
  • API
  • 编辑器
  • IDE 插件
  • Single Sign-On (SSO)
  • 论坛
  • 帮助
  • 博客
  • Pricing
  • Contact Sales
  • Languages icon中文
    • English
    • 한국어
    • Русский
    • Français
    • Deutsch
    • 日本語
    • 参与翻译
  • GitHub

›Model

基础知识

  • 概述
  • 开始使用
  • 工作原理
  • 教程

Model

  • 支持的Models
  • Model语法
  • 效果器
  • 函数
  • 基于角色的访问控制
  • RBAC with Pattern
  • 域内RBAC
  • Casbin RBAC v.s. RBAC96
  • ABAC
  • 优先级模型
  • 超级管理员

存储

  • Model存储
  • Policy存储
  • 政策子集加载

扩充功能

  • Enforcers
  • 适配器
  • 观察者
  • 调度器
  • 角色管理器
  • 中间件
  • Graphql 中间件
  • 云端原生中间值

API

  • API 概述
  • 管理 API
  • RBAC API
  • 域内基于角色的访问控制 API
  • RoleManager API
  • 数据权限

高级用法

  • 多线程
  • 基准测试
  • 性能优化
  • Kubernetes的授权
  • 通过特使核准服务网格。

管理

  • 管理员门户
  • Casbin 服务
  • 日志 & 错误处理
  • 前端使用

编辑器

  • 在线编辑器
  • IDE 插件

更多

  • 本项目使用者
  • 贡献中
  • 隐私政策
  • 服务条款
Translate

Model语法

  • Model CONF 至少应包含四个部分: [request_definition], [policy_definition], [policy_effect], [matchers]。

  • 如果 model 使用 RBAC, 还需要添加[role_definition]部分。

  • Model CONF 文件可以包含注释。注释以 # 开头, # 会注释该行剩余部分。

Request定义

[request_definition] 部分用于request的定义,它明确了 e.Enforce(...) 函数中参数的含义。

[request_definition]
r = sub, obj, act

sub, obj, act 表示经典三元组: 访问实体 (Subject),访问资源 (Object) 和访问方法 (Action)。 但是, 你可以自定义你自己的请求表单, 如果不需要指定特定资源,则可以这样定义 sub、act ,或者如果有两个访问实体, 则为 sub、sub2、obj、act。

Policy定义

[policy_definition] 部分是对policy的定义,以下文的 model 配置为例:

[policy_definition]
p = sub, obj, act
p2 = sub, act

这些是我们对policy规则的具体描述

p, alice, data1, read
p2, bob, write-all-objects

policy部分的每一行称之为一个策略规则, 每条策略规则通常以形如p, p2的policy type开头。 如果存在多个policy定义,那么我们会根据前文提到的policy type与具体的某条定义匹配。 上面的policy的绑定关系将会在matcher中使用, 罗列如下:

(alice, data1, read) -> (p.sub, p.obj, p.act)
(bob, write-all-objects) -> (p2.sub, p2.act)
tip

策略规则中的元素总被视为字符串. 如果您对此有任何疑问,请查看https://github.com/casbin/casbin/issues/113 中的讨论。

Policy effect定义

[policy_effect] 是策略效果的定义。 它确定如果多项政策规则与请求相符,是否应批准访问请求。 例如,一项规则允许,另一项规则则加以拒绝。

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

上面的策略效果表示如果有任何匹配的策略规则 允许, 最终效果是 允许 (aka allow-override). p.eft 是策略的效果,它可以 允许 或 否定。 它是可选的,默认值是 允许。 因为我们没有在上面指定它,所以它使用默认值。

策略效果的另一个例子是:

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

这意味着如果没有匹配的政策规则为否定, 最终效果是 允许 (别名为拒绝). some 表示:如果存在一个匹配的策略规则。 any 意味着:所有匹配的政策规则(这里不使用)。 策略效果甚至可以与逻辑表达式相关联:

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

这意味着至少有一个匹配的策略规则允许,并且没有匹配的否定的 的策略规则。 因此,允许和拒绝授权都得到支持,拒绝则被推翻。

note

尽管我们设计了政策效果的语法。 目前的执行只是使用硬编码的政策效果,因为我们认为这种灵活性没有多大必要。 所以现在您必须使用内置的政策效果之一,而不是自定义您自己的效果。

支持的内在政策效应是:

Policy effect意义示例
some(where (p.eft == allow))allow-overrideACL, RBAC, etc.
!some(where (p.eft == deny))deny-overrideDeny-override
some(where (p.eft == allow)) && !some(where (p.eft == deny))allow-and-denyAllow-and-deny
priority(p.eft) || denypriorityPriority
subjectPriority(p.eft)基于角色的优先级主题优先级

匹配器

[matchers] 是策略匹配程序的定义。匹配程序是表达式。它定义了如何根据请求评估策略规则。

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

上述匹配器是最简单的,这意味着请求中的主题、对象和行动应该与政策规则中的匹配。

您可以在匹配器中使用诸如 +, -, *, / 和逻辑操作员,例如 &&, ||, !

多个班级类型

如果您需要多个策略定义或多个匹配器,您可以使用 p2, m2。 事实上,以上四个部分都可以使用多个类型,语法是 r+number 。 例如 r2, e2。 默认情况下,这四个部分应对应一个。 如您的 r2 只能使用匹配器 m2 匹配策略 p2。

您可以通过 EnforceContext 作为 的第一个参数来执行 方法来指定类型, EnforceContext 就像这样的

go
Node.js
Java
EnforceContext{"r2","p2","e2","m2"}
type EnforceContext struct {
RType string
PType string
EType string
MType string
}
const enforceContext = new EnforceContext('r2', 'p2', 'e2', 'm2');
class EnforceContext {
constructor(rType, pType, eType, mType) {
this.pType = pType;
this.eType = eType;
this.mType = mType;
this.rType = rType;
}
}
EnforceContext enforceContext = new EnforceContext("2");
public class EnforceContext {
private String pType;
private String eType;
private String mType;
private String rType;
public EnforceContext(String suffix) {
this.pType = "p" + suffix;
this.eType = "e" + suffix;
this.mType = "m" + suffix;
this.rType = "r" + suffix;
}
}

示例用法,请参阅 model and policy, 请求如下所示:

go
Node.js
Java
/ 在后缀将参数传入NewEnforceContext,例如2或3,它将创建 r2,p2,等。
enforceContext := NewEnforceContext("2")
// You can also specify a certain type individually
enforceContext.EType = "e"
// Don't pass in EnforceContext,the default is r,p,e,m
e.Enforce("alice", "data2", "read") // true
// pass in EnforceContext
e.Enforce(enforceContext, struct{ Age int }{Age: 70}, "/data1", "read") //false
e.Enforce(enforceContext, struct{ Age int }{Age: 30}, "/data1", "read") //true
/ 在后缀将参数传入NewEnforceContext,例如2或3,它将创建 r2,p2,等。
const enforcement Context = new NewEnforceContext('2');
// 您也可以单独指定一种特定类型
enforcement。 输入 = “e”
// 不要通过EnforceContext,默认是 r,p,e,m
e.enforce ("Alice", "data2", "read") // true
// passes in EnforceContext
e.enforce (enforcement Context, {Age: 70}, "/data1", "read") //false
e.enforce (enforcement Context, {Age: 30}, "/data1", "read") //true
// 在后缀通过作为参数到NewEnforceContext, 这种做法是2或3,它将产生r2,第2页,等等。
EnforceContext enforcement Context = new EnforceContext("2");
// 您也可以单独指定一种特定类型
enforcement.seteType("e");
// 不要在EnforceContext中通过, 默认是 r, p, e, m
e.enforce ("alice", "data2", "read"); // true
// "Passs in EnforceContext
// TestEvalRule 在 https://github. om/casbin/jcasbin/blob/master/src/test/java/org/casbin/jcasbin/main/AbacAPIUnitTest.java#L56
e.enforcement (enforcement Context, new AbacAPIUnitTest.Test.TestEvalRule("alice", 70), "/data1", "read"); //false
e.enforcement (enforcement Context, new AbacAPIUnitTest.TestEvalRule("alice", 30), "/data1", "read"); //true

Special Grammer

您也可以在中使用 ,这是唯一一个有文本名称的操作员。 此操作员检查右侧数组以查看它是否包含等于左侧数值的值。 平等是由使用 == 运算符决定的,这个库不检查值之间的类型。 任何两个值在投射到接口 {}时仍然可以检查是否与== 平等,它们将按预期的那样起作用。 请注意,你可以使用数组的参数,但它必须是 <code>[]interface{}。

也参考 rbac_model_matcher_using_in_op, keyget2_model 和 keyget_model

示例:

[request_definition]
r = sub, obj
...
[matchers]
m = r.sub.name in (r.obj.Admins)
e.Enforce(Sub{name: "alice"}, Obj{Name: "a book", Admins: []interface{}{"alice", "bob"}}})

表达式评估器

Casbin的匹配器评价是由表达式评价员以每种语言进行的。 Casbin整合了他们的权力,提供统一的PERM语言。 除了这里提供的所有模型语法外,这些表达式评估员可能提供额外的功能,这些功能可能不会被另一种语言或实现所支持。 使用它的风险是由您自己承担的。

每个Casbin 实现时使用的表达式评估器有:

实现语言表达式运算器
CasbinGolanghttps://github.com/Knetic/govaluate
jCasbinJavahttps://github.com/killme2008/aviator
Node-CasbinNode.jshttps://github.com/donmccurdy/expression-eval
PHP-CasbinPHPhttps://github.com/symfony/expression-language
PyCasbinPythonhttps://github.com/danthedeckie/simpleeval
Casbin.NETC#https://github.com/davideicardi/DynamicExpresso
Casbin4DDelphihttps://github.com/casbin4d/Casbin4D/tree/master/SourceCode/Conce/Third%20Party/TExpressionParser
casbin-rsRusthttps://github.com/jonathandturner/rhai
casbin-cppC++https://github.com/ArashPartow/exprtk
note

如果你遇到关于Casbin的性能问题,这可能是表达式评价员效率低下造成的。 您都可以直接将问题发送到Casbin或表达式评估器以获得咨询以加速。 详见 基准 部分。

← 支持的Models效果器 →
  • Request定义
  • Policy定义
  • Policy effect定义
  • 匹配器
  • 多个班级类型
    • Special Grammer
    • 表达式评估器
Casbin
Docs
Getting StartedManagement APIRBAC APIMiddlewares
Community
Who's using Casbin?Stack Overflow
Casbin          jCasbin
Node-Casbin   PHP-CasbinPyCasbin          Casbin.NETCasbin-CPP        Casbin-RS
Follow @casbinHQ
Copyright © 2022 Casbin Organization