techart / abac
craftcamp/php-abac 的分支 - 在 PHP 应用中实现基于属性的访问控制(ABAC)的库
Requires
- php: >=7.0
- psr/cache: ~1.0
- symfony/config: ~3.0|^4.0|^5.0
- symfony/yaml: ~3.0|^4.0|^5.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.12
- phpunit/phpunit: ^6.5
This package is auto-updated.
Last update: 2024-09-10 14:01:27 UTC
README
基于属性的访问控制(ABAC)实现库
这是 CraftCamp/php-abac 的分支
介绍
此库旨在在您的 PHP 应用程序中实现 ABAC 的概念。
该概念是通过使用属性来管理访问控制:来自用户、资源和环境。
它允许我们根据用户对象属性和可选的访问对象属性定义规则。
这些规则将在您的应用程序中检查,以确定用户是否允许执行操作。
以下链接解释了什么是 ABAC
安装
使用 composer
composer require techart/abac
然后您需要配置应用程序的属性和规则。
有关此方面的更多详细信息,请参阅专用文档
文档
使用示例
仅定义规则中用户属性的示例
在这个例子中,我们有一个对象,代表当前用户。
此对象具有属性,并提供getter方法来访问值。
例如,我们可以编写
<?php use TechartAbac\AbacFactory; class User{ protected $id; protected $isBanned; public function getId() { return $this->id; } public function setIsBanned($isBanned) { $this->isBanned = $isBanned; return $this; } public function getIsBanned() { return $this->isBanned; } } $user = new User(); $user->setIsBanned(true); $abac = AbacFactory::getAbac([ 'policy_rule_configuration.yml' ]); $abac->enforce('create-group', $user);
规则检查的属性可以是
用户和对象属性都定义的示例
use TechartAbac\AbacFactory; $abac = AbacFactory::getAbac([ 'policy_rule_configuration.yml' ]); $check = $abac->enforce('read-public-group', $user, $group);
检查的属性可以是
动态属性示例
<?php use TechartAbac\AbacFactory; $abac = AbacFactory::getAbac([ 'policy_rule_configuration.yml' ]); $check = $abac->enforce('edit-group', $user, $group, [ 'dynamic-attributes' => [ 'group-owner' => $user->getId() ] ]);
引用属性示例
配置应该是
attributes: group: class: MyApp\Model\Group type: resource fields: author.id: name: Author ID app_user: class: MyApp\Model\User type: user fields: id: name: User ID rules: remove-group: attributes: app_user.id: comparison: object comparison_type: isFieldEqual value: group.author.id
然后代码
<?php use TechartAbac\AbacFactory; $abac = AbacFactory::getAbac([ 'policy_rule_configuration.yml' ]); $check = $abac->enforce('remove-group', $user, $group);
带缓存的示例
$check = $abac->enforce('edit-group', $user, $group, [ 'cache_result' => true, 'cache_ttl' => 3600, // Time To Live in seconds 'cache_driver' => 'memory' // memory is the default driver, you can avoid this option ]);
对于唯一规则(ruleSet)的多个规则(规则集)。每个规则都会被测试,并且当 ruleSet 中的第一个规则允许访问时,处理会停止。
配置应该是(alcoolaw.yml)
attributes: main_user: class: TechartAbac\Example\User type: user fields: age: name: Age country: name: Code ISO du pays rules: alcoollaw: - attributes: main_user.age: comparison_type: numeric comparison: isGreaterThan value: 18 main_user.country: comparison_type: string comparison: isEqual value: FR - attributes: main_user.age: comparison_type: numeric comparison: isGreaterThan value: 21 main_user.country: comparison_type: string comparison: isNotEqual value: FR
然后代码
<?php use TechartAbac\AbacFactory; $abac = AbacFactory::getAbac([ 'alcoollaw.yml' ]); $check = $abac->enforce('alcoollaw', $user);
将规则根目录传递给 Abac 类的示例。此功能允许直接将策略定义规则目录路径传递给 Abac 类,而无需添加到所有文件中。
假设我们有 3 个 yaml 文件
- rest/conf/policy/user_def.yml
- rest/conf/policy/gunlaw.yml
PHP 代码可以是
<?php use TechartAbac\AbacFactory; $abac = AbacFactory::getAbac([ 'user_def.yml', 'gunlaw.yml', ],[],'rest/conf/policy/'); $check = $abac->enforce('gunlaw', $user);
贡献
如果您想贡献,请不要犹豫,分支库并提交 Pull Requests。
您还可以报告问题、建议增强功能,自由地给出建议和关于此库的反馈。
它还没有完成,还有许多功能要实现以使其更好。如果您想成为此库改进的一部分,请告诉我们!