apache/casbin
GitHub: apache/casbin
一个支持 ACL、RBAC、ABAC 等多种访问控制模型的多语言授权库,将权限模型抽象为配置文件以实现灵活的授权管理。
Stars: 20264 | Forks: 1752
# Apache Casbin
[](https://goreportcard.com/report/github.com/apache/casbin)
[](https://github.com/apache/casbin/actions/workflows/default.yml)
[](https://coveralls.io/github/apache/casbin?branch=master)
[](https://pkg.go.dev/github.com/casbin/casbin/v2)
[](https://github.com/apache/casbin/releases/latest)
[](https://discord.gg/S5UjpzGZjN)
[](https://sourcegraph.com/github/apache/apache/casbin?badge)
**新闻**:还在为如何编写正确的 Apache Casbin 策略而烦恼吗?``Apache Casbin 在线编辑器``来帮您!请在:https://casbin.apache.org/editor/ 体验

Apache Casbin 是一个专为 Golang 项目打造的强大且高效的开源访问控制库。它支持基于各种[访问控制模型](https://en.wikipedia.org/wiki/Computer_security_model)来执行授权。
## Apache Casbin 支持的所有语言:
| [](https://github.com/apache/casbin) | [](https://github.com/casbin/jcasbin) | [](https://github.com/casbin/node-casbin) | [](https://github.com/php-casbin/php-casbin) |
|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
| [Casbin](https://github.com/apache/casbin) | [jCasbin](https://github.com/casbin/jcasbin) | [node-Casbin](https://github.com/casbin/node-casbin) | [PHP-Casbin](https://github.com/php-casbin/php-casbin) |
| 生产就绪 | 生产就绪 | 生产就绪 | 生产就绪 |
| [](https://github.com/casbin/pycasbin) | [](https://github.com/casbin-net/Casbin.NET) | [](https://github.com/casbin/casbin-cpp) | [](https://github.com/casbin/casbin-rs) |
|--------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------|
| [PyCasbin](https://github.com/casbin/pycasbin) | [Casbin.NET](https://github.com/casbin-net/Casbin.NET) | [Casbin-CPP](https://github.com/casbin/casbin-cpp) | [Casbin-RS](https://github.com/casbin/casbin-rs) |
| 生产就绪 | 生产就绪 | 生产就绪 | 生产就绪 |
## 目录
- [支持的模型](#supported-models)
- [工作原理?](#how-it-works)
- [功能](#features)
- [安装说明](#installation)
- [文档](#documentation)
- [在线编辑器](#online-editor)
- [教程](#tutorials)
- [快速入门](#get-started)
- [策略管理](#policy-management)
- [策略持久化](#policy-persistence)
- [多节点间的策略一致性](#policy-consistence-between-multiple-nodes)
- [角色管理器](#role-manager)
- [基准测试](#benchmarks)
- [示例](#examples)
- [中间件](#middlewares)
- [我们的使用者](#our-adopters)
## 支持的模型
1. [**ACL (访问控制列表)**](https://en.wikipedia.org/wiki/Access_control_list)
2. **带[超级用户](https://en.wikipedia.org/wiki/Superuser)的 ACL**
3. **不带用户的 ACL**:特别适用于没有身份验证或用户登录的系统。
4. **不带资源的 ACL**:某些场景可能通过使用诸如 ``write-article``、``read-log`` 等权限来针对某一类型的资源,而不是单个资源。它不控制对特定文章或日志的访问。
5. **[RBAC (基于角色的访问控制)](https://en.wikipedia.org/wiki/Role-based_access_control)**
6. **带资源角色的 RBAC**:用户和资源可以同时拥有角色(或组)。
7. **带域/租户的 RBAC**:用户可以针对不同的域/租户拥有不同的角色集合。
8. **[ABAC (基于属性的访问控制)](https://en.wikipedia.org/wiki/Attribute-Based_Access_Control)**:可以使用诸如 ``resource.Owner`` 之类的语法糖来获取资源的属性。
9. **[RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer)**:支持诸如 ``/res/*``、``/res/:id`` 的路径以及诸如 ``GET``、``POST``、``PUT``、``DELETE`` 的 HTTP 方法。
10. **拒绝覆盖**:同时支持允许和拒绝授权,且拒绝优先于允许。
11. **优先级**:策略规则可以像防火墙规则一样设置优先级。
## 工作原理?
在 Casbin 中,访问控制模型基于 **PERM 元模型 (Policy, Effect, Request, Matchers)** 被抽象为一个 CONF 文件。因此,切换或升级项目的授权机制就像修改配置一样简单。您可以通过组合可用的模型来自定义您的访问控制模型。例如,您可以在一个模型中同时使用 RBAC 角色和 ABAC 属性,并共享一组策略规则。
Casbin 中最基本、最简单的模型是 ACL。ACL 的模型 CONF 为:
```
# 请求定义
[request_definition]
r = sub, obj, act
# Policy 定义
[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**,否则会导致 panic。
如需了解更多运算符,您可以查看 [govaluate](https://github.com/casbin/govaluate)
## 功能
Apache Casbin 所做的事:
1. 以经典的 ``{subject, object, action}`` 形式或您自定义的形式执行策略,同时支持允许和拒绝授权。
2. 处理访问控制模型及其策略的存储。
3. 管理角色-用户映射和角色-角色映射(即 RBAC 中的角色层级)。
4. 支持诸如 ``root`` 或 ``administrator`` 的内置超级用户。超级用户无需显式权限即可执行任何操作。
5. 提供多种内置运算符以支持规则匹配。例如,``keyMatch`` 可以将资源键 ``/foo/bar`` 映射到模式 ``/foo*``。
Apache Casbin 不做的事:
1. 身份验证(即验证用户登录时的 ``username`` 和 ``password``)
2. 管理用户或角色列表。我相信由项目本身来管理这些实体会更方便。用户通常有自己的密码,而 Apache Casbin 并非设计为密码容器。然而,Apache Casbin 会存储 RBAC 场景下的用户-角色映射。
## 安装
```
go get github.com/casbin/casbin/v3
```
## 文档
https://casbin.apache.org/docs/overview
## 在线编辑器
您还可以使用在线编辑器 (https://casbin.apache.org/editor/) 在 Web 浏览器中编写您的 Casbin 模型和策略。它提供了诸如 ``语法高亮`` 和 ``代码补全`` 等功能,就像编程语言的 IDE 一样。
## 教程
https://casbin.apache.org/docs/tutorials
## 快速入门
1. 使用模型文件和策略文件新建一个 Casbin enforcer:
e, _ := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
注意:您也可以使用数据库中的策略而不是文件来初始化 enforcer,详情请参阅[策略持久化](#policy-persistence)部分。
2. 在访问发生之前,将执行钩子添加到您的代码中:
sub := "alice" // 想要访问资源的用户。
obj := "data1" // 将要被访问的资源。
act := "read" // 用户对资源执行的操作。
if res, _ := e.Enforce(sub, obj, act); res {
// 允许 alice 读取 data1
} else {
// 拒绝请求,显示错误
}
3. 除了静态策略文件外,Apache Casbin 还提供了在运行时管理权限的 API。例如,您可以获取分配给用户的所有角色,如下所示:
roles, _ := e.GetImplicitRolesForUser(sub)
更多用法请参阅[策略管理 API](#policy-management)。
## 策略管理
Apache Casbin 提供了两套 API 来管理权限:
- [管理 API](https://casbin.apache.org/docs/management-api):提供对 Apache Casbin 策略管理全面支持的基础 API。
- [RBAC API](https://casbin.apache.org/docs/rbac-api):对 RBAC 更加友好的 API。此 API 是管理 API 的子集。RBAC 用户可以使用此 API 来简化代码。
我们还提供了一个基于 Web 的 [UI 界面](https://casbin.apache.org/docs/admin-portal),用于模型管理和策略管理:


## 策略持久化
https://casbin.apache.org/docs/adapters
## 多节点间的策略一致性
https://casbin.apache.org/docs/watchers
## 角色管理器
https://casbin.apache.org/docs/role-managers
## 基准测试
https://casbin.apache.org/docs/benchmark
## 示例
| 模型 | 模型文件 | 策略文件 |
|---------------------------|----------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
| ACL | [basic_model.conf](https://github.com/apache/casbin/blob/master/examples/basic_model.conf) | [basic_policy.csv](https://github.com/apache/casbin/blob/master/examples/basic_policy.csv) |
| 带超级用户的 ACL | [basic_model_with_root.conf](https://github.com/apache/casbin/blob/master/examples/basic_with_root_model.conf) | [basic_policy.csv](https://github.com/apache/casbin/blob/master/examples/basic_policy.csv) |
| 不带用户的 ACL | [basic_model_without_users.conf](https://github.com/apache/casbin/blob/master/examples/basic_without_users_model.conf) | [basic_policy_without_users.csv](https://github.com/apache/casbin/blob/master/examples/basic_without_users_policy.csv) |
| 不带资源的 ACL | [basic_model_without_resources.conf](https://github.com/apache/casbin/blob/master/examples/basic_without_resources_model.conf) | [basic_policy_without_resources.csv](https://github.com/apache/casbin/blob/master/examples/basic_without_resources_policy.csv) |
| RBAC | [rbac_model.conf](https://github.com/apache/casbin/blob/master/examples/rbac_model.conf) | [rbac_policy.csv](https://github.com/apache/casbin/blob/master/examples/rbac_policy.csv) |
| 带资源角色的 RBAC | [rbac_model_with_resource_roles.conf](https://github.com/apache/casbin/blob/master/examples/rbac_with_resource_roles_model.conf) | [rbac_policy_with_resource_roles.csv](https://github.com/apache/casbin/blob/master/examples/rbac_with_resource_roles_policy.csv) |
| 带域/租户的 RBAC | [rbac_model_with_domains.conf](https://github.com/apache/casbin/blob/master/examples/rbac_with_domains_model.conf) | [rbac_policy_with_domains.csv](https://github.com/apache/casbin/blob/master/examples/rbac_with_domains_policy.csv) |
| ABAC | [abac_model.conf](https://github.com/apache/casbin/blob/master/examples/abac_model.conf) | N/A |
| RESTful | [keymatch_model.conf](https://github.com/apache/casbin/blob/master/examples/keymatch_model.conf) | [keymatch_policy.csv](https://github.com/apache/casbin/blob/master/examples/keymatch_policy.csv) |
| 拒绝覆盖 | [rbac_model_with_deny.conf](https://github.com/apache/casbin/blob/master/examples/rbac_with_deny_model.conf) | [rbac_policy_with_deny.csv](https://github.com/apache/casbin/blob/master/examples/rbac_with_deny_policy.csv) |
| 优先级 | [priority_model.conf](https://github.com/apache/casbin/blob/master/examples/priority_model.conf) | [priority_policy.csv](https://github.com/apache/casbin/blob/master/examples/priority_policy.csv) |
## 中间件
Web 框架的 Authz 中间件:https://casbin.apache.org/docs/middlewares
## 我们的使用者
https://casbin.apache.org/docs/adopters
## 许可证
本项目基于 [Apache 2.0 许可证](LICENSE) 授权。
## 联系我们
如果您有任何问题或功能请求,请联系我们。欢迎提交 PR。
- https://github.com/apache/casbin/issues
- https://discord.gg/S5UjpzGZjN
标签:EVTX分析, Golang, JS文件枚举, MITM代理, RBAC, Streamlit, XML 请求, 可视化界面, 安全开发, 安全编程, 授权库, 日志审计, 访问控制, 逆向工具