支持Python中ACL、RBAC、ABAC等访问控制模型的授权库
项目描述
PyCasbin
赞助商
更快地构建带有欺诈预防的认证。
尝试使用API优先的认证、用户和组织管理、多租户SSO、多因素认证、设备指纹识别等。Stytch。
💖 寻找类似Okta、Auth0、Keycloak的开源身份和访问管理解决方案?了解更多关于:Casdoor
新闻: 🔥 如何与 Django
一起使用?尝试 Django Authorization,Django框架的授权库。
新闻: Async现在由Pycasbin >= 1.23.0支持!
新闻: 仍然担心如何编写正确的Casbin策略?Casbin在线编辑器
即将推出,帮助您!在:http://casbin.org/editor/
Casbin是一个强大的、高效的Python项目开源访问控制库。它提供了基于各种访问控制模型的授权支持。
Casbin支持的所有语言
Casbin | jCasbin | node-Casbin | PHP-Casbin |
生产就绪 | 生产就绪 | 生产就绪 | 生产就绪 |
PyCasbin | Casbin.NET | Casbin-CPP | Casbin-RS |
生产就绪 | 生产就绪 | beta测试 | 生产就绪 |
目录
支持模型
- ACL(访问控制列表)
- 带有超级用户的ACL
- 无用户ACL:特别适用于没有身份验证或用户登录的系统。
- 无资源ACL:某些场景可能通过使用权限(如
write-article
、read-log
)来针对一种资源类型,而不是针对单个资源。它不控制对特定文章或日志的访问。 - RBAC(基于角色的访问控制)
- 带有资源角色的RBAC:用户和资源可以同时拥有角色(或组)。
- 带有域/租户的RBAC:用户可以为不同的域/租户拥有不同的角色集。
- ABAC(基于属性的访问控制):可以使用如
resource.Owner
这样的语法糖来获取资源的属性。 - RESTful:支持路径如
/res/*
、/res/:id
以及HTTP方法如GET
、POST
、PUT
、DELETE
。 - 拒绝覆盖:支持允许和拒绝授权,拒绝覆盖允许。
- 优先级:策略规则可以像防火墙规则一样进行优先级排序。
它是如何工作的?
在Casbin中,一个访问控制模型被抽象为一个基于PERM元模型(策略、效果、请求、匹配器)的CONF文件。因此,切换或升级项目的授权机制就像修改配置一样简单。您可以通过组合可用的模型来自定义自己的访问控制模型。例如,您可以在一个模型中同时获取RBAC角色和ABAC属性,并共享一组策略规则。
Casbin中最基本和最简单的模型是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
我们还支持多行模式,通过在末尾添加'\’来实现
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act
此外,如果您正在使用ABAC,您可以在Casbin的golang
版本中尝试以下操作符in
(jCasbin和Node-Casbin尚不支持)
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
但您必须确保数组的长度大于1,否则将导致它崩溃。
有关更多操作符,您可以查看govaluate
特性
Casbin做什么
- 在经典
{主体,对象,动作}
形式或您定义的定制形式中执行策略,支持允许和拒绝授权。 - 处理访问控制模型及其策略的存储。
- 管理角色-用户映射和角色-角色映射(即RBAC中的角色层次结构)。
- 支持内置超级用户如
root
或administrator
。超级用户可以无权限执行任何操作。 - 多个内置操作符以支持规则匹配。例如,
keyMatch
可以将资源键/foo/bar
映射到模式/foo*
。
Casbin不做什么
- 身份验证(即在用户登录时验证
username
和password
) - 管理用户或角色的列表。我相信对于项目本身来说,管理这些实体更为方便。用户通常有自己的密码,Casbin不是作为密码容器设计的。然而,Casbin为RBAC场景存储用户-角色映射。
安装
pip install casbin
文档
https://casbin.org/docs/overview
在线编辑器
您还可以使用在线编辑器(http://casbin.org/editor/)在您的网络浏览器中编写您的Casbin模型和政策。它提供功能,如语法高亮显示
和代码补全
,就像编程语言的IDE一样。
教程
https://casbin.org/docs/tutorials
开始使用
- 使用模型文件和策略文件创建一个新的Casbin执行器
import casbin
e = casbin.Enforcer("path/to/model.conf", "path/to/policy.csv")
注意:您还可以使用策略初始化执行器,而不是使用文件,有关详细信息,请参阅策略持久化部分。
- 在访问发生之前,将执行钩子添加到您的代码中
sub = "alice" # the user that wants to access a resource.
obj = "data1" # the resource that is going to be accessed.
act = "read" # the operation that the user performs on the resource.
if e.enforce(sub, obj, act):
# permit alice to read data1
pass
else:
# deny the request, show an error
pass
- 除了静态策略文件外,Casbin还提供了在运行时进行权限管理的API。例如,您可以通过以下方式获取分配给用户的所有角色
roles = e.get_roles_for_user("alice")
有关更多用法,请参阅策略管理API
- 请参阅
tests
文件以获取更多用法。
策略管理
Casbin提供了两组管理权限的API
- 管理API:提供对Casbin策略管理全面支持的原始API。有关示例,请参阅此处。
- RBAC API:更友好的RBAC API。此API是管理API的子集。RBAC用户可以使用此API简化代码。有关示例,请参阅此处。
我们还提供基于Web的UI用于模型管理和策略管理
策略持久化
https://casbin.org/docs/adapters
角色管理器
https://casbin.org/docs/role-managers
异步执行器
如果您的代码使用async
/ await
并且高度依赖于I/O操作,您可以使用异步执行器!
- 创建一个异步引擎,并使用模型文件和异步Pycasbin适配器(AsyncAdapter子类)创建一个新的Casbin AsyncEnforcer
import asyncio
import os
import casbin
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from casbin_async_sqlalchemy_adapter import Adapter, CasbinRule
async def get_enforcer():
engine = create_async_engine("sqlite+aiosqlite://", future=True)
adapter = Adapter(engine)
await adapter.create_table()
async_session = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
async with async_session() as s:
s.add(CasbinRule(ptype="p", v0="alice", v1="data1", v2="read"))
s.add(CasbinRule(ptype="p", v0="bob", v1="data2", v2="write"))
s.add(CasbinRule(ptype="p", v0="data2_admin", v1="data2", v2="read"))
s.add(CasbinRule(ptype="p", v0="data2_admin", v1="data2", v2="write"))
s.add(CasbinRule(ptype="g", v0="alice", v1="data2_admin"))
await s.commit()
e = casbin.AsyncEnforcer("path/to/model.conf", adapter)
await e.load_policy()
return e
注意:您可以在适配器 | Casbin中查看所有支持的适配器。
内置的异步适配器在casbin.persist.adapters.asyncio
中可用。
- 在访问发生之前,将执行钩子添加到您的代码中
async def main():
e = await get_enforcer()
if e.enforce("alice", "data1", "read"):
print("alice can read data1")
else:
print("alice can not read data1")
- 运行代码
asyncio.run(main())
- 请参阅
tests
文件以获取更多用法。
基准测试
https://casbin.org/docs/benchmark
示例
模型 | 模型文件 | 策略文件 |
---|---|---|
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 |
Deny-override | rbac_model_with_deny.conf | rbac_policy_with_deny.csv |
优先级 | priority_model.conf | priority_policy.csv |
中间件
Web框架的授权中间件:https://casbin.org/docs/middlewares
我们的采用者
https://casbin.org/docs/adopters
贡献者
支持者
感谢所有支持者! 🙏 [成为支持者]
赞助商
通过成为赞助商来支持此项目。您的标志将显示在此处,并提供到您网站的链接。 [成为赞助商]
许可
此项目采用Apache 2.0许可。
联系方式
如果您有任何问题或功能请求,请与我们联系。PR受到欢迎。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。