跳转到主要内容

支持Python中ACL、RBAC、ABAC等访问控制模型的授权库

项目描述

PyCasbin

GitHub Action Coverage Status Version PyPI - Wheel Pyversions Download Discord

赞助商

更快地构建带有欺诈预防的认证。
尝试使用API优先的认证、用户和组织管理、多租户SSO、多因素认证、设备指纹识别等。Stytch。

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

casdoor

新闻: 🔥 如何与 Django 一起使用?尝试 Django Authorization,Django框架的授权库。

新闻: Async现在由Pycasbin >= 1.23.0支持!

新闻: 仍然担心如何编写正确的Casbin策略?Casbin在线编辑器即将推出,帮助您!在:http://casbin.org/editor/

Casbin是一个强大的、高效的Python项目开源访问控制库。它提供了基于各种访问控制模型的授权支持。

Casbin支持的所有语言

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

目录

支持模型

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

它是如何工作的?

在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做什么

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

Casbin不做什么

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

安装

pip install casbin

文档

https://casbin.org/docs/overview

在线编辑器

您还可以使用在线编辑器(http://casbin.org/editor/)在您的网络浏览器中编写您的Casbin模型和政策。它提供功能,如语法高亮显示代码补全,就像编程语言的IDE一样。

教程

https://casbin.org/docs/tutorials

开始使用

  1. 使用模型文件和策略文件创建一个新的Casbin执行器
import casbin
e = casbin.Enforcer("path/to/model.conf", "path/to/policy.csv")

注意:您还可以使用策略初始化执行器,而不是使用文件,有关详细信息,请参阅策略持久化部分。

  1. 在访问发生之前,将执行钩子添加到您的代码中
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
  1. 除了静态策略文件外,Casbin还提供了在运行时进行权限管理的API。例如,您可以通过以下方式获取分配给用户的所有角色
roles = e.get_roles_for_user("alice")

有关更多用法,请参阅策略管理API

  1. 请参阅tests文件以获取更多用法。

策略管理

Casbin提供了两组管理权限的API

  • 管理API:提供对Casbin策略管理全面支持的原始API。有关示例,请参阅此处
  • RBAC API:更友好的RBAC API。此API是管理API的子集。RBAC用户可以使用此API简化代码。有关示例,请参阅此处

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

model editor

policy editor

策略持久化

https://casbin.org/docs/adapters

角色管理器

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

异步执行器

如果您的代码使用async / await并且高度依赖于I/O操作,您可以使用异步执行器!

  1. 创建一个异步引擎,并使用模型文件和异步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中可用。

  1. 在访问发生之前,将执行钩子添加到您的代码中
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")
  1. 运行代码
asyncio.run(main())
  1. 请参阅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受到欢迎。

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

casbin-1.36.3.tar.gz (421.2 kB 查看哈希值)

上传时间

构建分发

casbin-1.36.3-py3-none-any.whl (471.2 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面