Casbin

Casbin

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

›基础知识

基础知识

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

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

开始使用

安装

Go
Java
Node.js
PHP
Python
.NET
Rust
Delphi
Lua
go get github.com/casbin/casbin/v2
<— https://mvnrepository.com/artisfact/org.casbin/jcasbin -->
<dependency>
<groupId>org.casbin</groupId>
<artifactId>jcasbin</artifactId>
<version>1.x.y</version>
</dependency>
# NPM
npm install casbin --save

# Yarn
yarn add casbin

composer.json 中需要这个软件包。这将下载软件包:

composer require casbin/casbin
pip install casbin
dotnet add package Casbin.NET
cargo install cargo-edit
cargo add casbin

// 如果你使用异步标准作为异步执行者
cargo add async-std

// 如果你使用tokio作为异步执行者
cargo add tokio // 请确保您激活了其`macros`特性
luarocks install casbin  

如果报出错误:您的用户没有写入/usr/local/lib/luarocks/rocks 的权限,您可能需要以 root 用户身份运行或使用本地树,加上 --local 参数。 您可以将 --local 参数添加到您的命令后面,就像这样修改:

luarocks install casbin  --local

新建一个Casbin enforcer

Casbin使用配置文件来设置访问控制模式。

它有两个配置文件,model.conf和policy.csv。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。 Casbin的使用非常精炼。 基本上,我们只需要一个主要结构:enforcer。 当构建这个结构时,model.conf和policy.csv将被加载。

换句话说,要新建一个Casbin执行器,你必须提供一个Model和一个Adapter。

Casbin有一个FileAdapter,请看Adapter查看更多Adapter。

  • 使用Model文件和默认 FileAdapter:
Go
Java
Node.js
PHP
Python
.NET
Delphi
Rust
Lua
import "github.com/casbin/casbin/v2"

e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
import org.casbin.jcasbin.main.Enforcer;

Enforcer e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
import { newEnforcer } from 'casbin';

const e = await newEnforcer('path/to/model.conf', 'path/to/policy.csv');
require_once './vendor/autoload.php';

use Casbin\Enforcer;

$e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
import casbin

e = casbin.Enforcer("path/to/model.conf", "path/to/policy.csv")
using NetCasbin; 

var e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
var
casbin: ICasbin;
begin
casbin := TCasbin.Create('path/to/model.conf', 'path/to/policy.csv');
...
end
use casbin::prelude::*;

// 如果你使用 async_td 作为异步执行器
#[cfg(feature = "runtime-async-std")]
#[async_std::main]
async fn main() -> Result<()> {
let mut e = Enforcer::new("path/to/model.conf", "path/to/policy.csv").await?;
Ok(())
}

// 如果你使用 tokio 作为异步执行器
#[cfg(feature = "runtime-tokio")]
#[tokio::main]
async fn main() -> Result<()> {
let mut e = Enforcer::new("path/to/model.conf", "path/to/policy.csv").await?;
Ok(())
}
local Enforcer = require("casbin")
local e = Enforcer:new("path/to/model.conf", "path/to/policy.csv") - The Casbin Enforcer
  • 与其他Adapter一起使用Model text
Go
Python
import (
"log"

"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
xormadapter "github.com/casbin/xorm-adapter/v2"
_ "github.com/go-sql-driver/mysql"
)

// 使用 MySQL 数据库初始化一个 Xorm 适配器
a, err := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/casbin")
if err != nil {
log.Fatalf("error: adapter: %s", err)
}

m, err := model.NewModelFromString(`
[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
`
)
if err != nil {
log.Fatalf("error: model: %s", err)
}

e, err := casbin.NewEnforcer(m, a)
if err != nil {
log.Fatalf("error: enforcer: %s", err)
}
import casbin
import casbin_sqlalchemy_adapter


# Use SQLAlchemy Casbin adapter with SQLLite DB
adapter = casbin_sqlalchemy_adapter.Adapter('sqlite:///test.db')

# Create a config model policy
with open("rbac_example_model.conf", "w") as f:
f.write("""
[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
"""
)

# Create enforcer from adapter and config policy
e = casbin.Enforcer('rbac_example_model.conf', adapter)

检查权限

在访问发生之前,在你的代码中添加一个执行钩。

Go
Java
Node.js
PHP
Python
.NET
Delphi
Rust
Lua
sub := "alice" // 想要访问资源的用户
obj := "data1" // 将要被访问的资源
act := "read" // 用户对资源实施的操作

ok, err := e.Enforce(sub, obj, act)

if err != nil {
// 处理错误
}

if ok == true {
// 允许 alice 读取 data1
} else {
// 拒绝请求,抛出异常
}

// 您可以使用 BatchEnforce() 去批量处理一些请求。
// 这个方法返回一个布尔类型的切片,切片的下标对应二位数组的行标
// 例如 results[0] 是 {"alice", "data1", "read"} 的结果
results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
String sub = "alice"; // 想要访问资源的用户
String obj = "data1"; // 将要被访问的资源
String act = "read"; // 用户对资源进行的操作

if (e.enforce(sub, obj, act) == true) {
// 允许alice读取data1
} else {
// 拒绝请求,抛出异常
}
const sub = 'alice'; // 想要访问资源的用户
const obj = 'data1'; // 将要被访问的资源
const act = 'read'; // 用户对资源进行的操作

if ((await e.enforce(sub, obj, act)) === true) {
// 允许alice读取data1
} else {
// 拒绝请求,抛出异常
}
$sub = "alice"; // 想要访问资源的用户
$obj = "data1"; // 将要被访问的资源
$act = "read"; // 用户对资源进行的操作

if ($e->enforce($sub, $obj, $act) === true) {
// 允许alice读取data1
} else {
// 拒绝请求,抛出异常
}
sub = "alice"  # 想要访问资源的用户
obj = "data1" # 将要被访问的资源
act = "read" # 用户对资源进行的操作

if e.enforce(sub, obj, act):
# 允许alice读取data1
pass
else:
# 拒绝请求,抛出异常
pass
var sub = "alice";  # 想要访问资源的用户
var obj = "data1"; # 将要被访问的资源
var act = "read"; # 用户对资源进行的操作

if (await e.EnforceAsync(sub, obj, act))
{
// 允许alice读取data1
}
else
{
// 拒绝请求,抛出异常
}
if casbin.enforce(['alice,data1,read']) then
// Alice超级高兴,因为她能够读取data1了
else
// Alice很伤心
  let sub = "alice"; // 想要访问资源的用户
let obj = "data1"; // 将要被访问的资源
let act = "read"; // 用户对资源进行的操作

if e.enforce((sub, obj, act)).await? {
// 允许alice读取data1
} else {
// 发生错误
}
if e:enforce("alice", "data1", "read") then
-- 允许alice读取data1
else
-- 拒绝请求,抛出异常
end

Casbin还提供了在运行时进行权限管理的API。例如,你可以获得分配给一个用户的所有角色,如下所示:

Go
Java
Node.js
PHP
Python
.NET
Delphi
Rust
Lua
roles, err := e.GetRolesForUser("alice")
Roles roles = e.getRolesForUser("alice");
const roles = await e.getRolesForUser('alice');
$roles = $e->getRolesForUser("alice");
roles = e.get_roles_for_user("alice")
var roles = e.GetRolesForUser("alice");
roles = e.rolesForEntity("alice")
let roles = e.get_roles_for_user("alice");
local roles = e:GetRolesForUser("alice")

更多使用方法见Management API和RBAC API。

更多用法请参考测试案例。

← 概述工作原理 →
  • 安装
  • 新建一个Casbin enforcer
    • 检查权限
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