lanlin / god
支持ACL、RBAC、ABAC的权威证明系统
2.0.0
2019-08-01 08:59 UTC
Requires
- php: >=7.2
- monolog/monolog: ^1.23
- symfony/expression-language: ^4.3
Requires (Dev)
- phpunit/phpunit: ^7.2
README
"神说,要有光,就有了光."
"神会决定你是否拥有权限."
"愿神保佑你!"
安装
composer require lanlin/god
起源
God项目是在参考了Casbin(golang)项目之后编写的,感谢他们的辛勤工作。
更多详细内容,请参阅Casbin的文档。
支持的模式
- ACL(访问控制列表)
- 带有超级用户的ACL
- 无用户的ACL:特别适用于没有认证或用户登录的系统。
- 无资源的ACL:某些场景可能通过使用“写文章”、“读日志”等权限来针对资源类型而不是单个资源。它不控制对特定文章或日志的访问。
- RBAC(基于角色的访问控制)
- 带有资源角色的RBAC:用户和资源可以同时拥有角色(或组)。
- 带有域/租户的RBAC:用户可以为不同的域/租户拥有不同的角色集。
- ABAC(基于属性的访问控制):可以使用如
resource.Owner
之类的语法糖来获取资源的属性。 - RESTful:支持如
/res/*
、/res/:id
之类的路径和GET
、POST
、PUT
、DELETE
等HTTP方法。 - 拒绝覆盖:支持允许和拒绝授权,拒绝覆盖允许。
- 优先级:策略规则可以像防火墙规则一样进行优先级排序。
支持的适配器
- 文件适配器
- MongoDB适配器
- PHP PDO适配器(目前支持:MySQL、PostgreSQL、SQLite、SqlServer。)
它是如何工作的?
“谁”作为“角色”或“组”从“哪里”执行“操作”对“什么”得到“如何”?
访问控制模型被抽象为基于PERM元模型(策略、效果、请求、匹配器)的CONF文件。
因此,切换或升级项目的授权机制就像修改配置一样简单。
您可以通过组合可用的模型来自定义自己的访问控制模型。
例如,您可以在一个模型中同时获取RBAC角色和ABAC属性,并共享一组策略规则。
God中最基本和最简单的模型是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
演示
use God\God; $God = new God('path/to/model.conf', 'path/to/policy.csv'); $God->allows('you', 'evil book', 'read'); // Does God allows you to do this? new God(); new God(string $modelPath); new God(string $modelPath, string $policyFile); new God(string $modelPath, Adapter $adapter); new God(Model $model); new God(Model $model, Adapter $adapter); // demo for mysql $dbHost = "127.0.0.1"; $dbPort = 3306; $dbName = "your_database_name"; $username = "root"; $password = "your_password"; // php mysql pdo demo $pdo = new \PDO("mysql:host={$dbHost};port={$dbPort};dbname={$dbName}", $username, $password); // init god model with csv $g = new God('tests/Examples/rbac_model.conf', 'tests/Examples/rbac_policy.csv'); $m = $g->getModel(); // save policy to database $a = new Adapter($pdo); $a->savePolicy($m);
有关更多用法演示,请查看单元测试或
许可协议
本项目采用MIT许可协议。