brzez / access-policy-bundle
This package is not auto-updated.
Last update: 2024-09-14 19:14:42 UTC
README
概述
访问检查器,受Laravel启发。
它允许通过简单的 can 和 cannot 方法检查访问权限,这些方法通过 brzez_access_policy.access_policy_provider 服务访问。
它还通过两个全局函数扩展了twig。
can 至少需要两个参数
- 意图 - 你要检查什么访问权限,例如 view、edit 等
- 对象 - 你要检查访问权限的对象 cannot 是 can 的逆操作(所以 !can())
还可以向 can/cannot 方法传递额外的变量。
第二个参数始终用于查找匹配的策略。
其余的只是传递给策略的 can() 方法。
策略需要实现 AccessPolicyInterface,该接口要求实现 getPoliciedClass 方法。受策略管理的对象通过以下方式检查
is_a($object, $policy->getPoliciedClass());
这意味着它将适用于模拟实体。还可以为接口/父类实现“全局”策略。
策略作为服务注册。
策略服务需要标记为 access_policy,以便被访问策略提供者识别。
安装
composer require brzez/access-policy-bundle
在内核中启用该包
// app/AppKernel.php public function registerBundles() { $bundles = array( //... new Brzez\AccessPolicyBundle\BrzezAccessPolicyBundle(), //... ); return $bundles; }
注册策略
在 services.yml
services: test_policy: class: AppBundle\TestPolicy tags: - {name: access_policy}
命名意图方法
当使用 can/cannot 方法时,意图以 kebab-case 编写,不包含 can/cannot 单词。
示例
// Will run canChangeStatus($something) on the policy $this->can('change-status', $something); // Will return negated canChangeStatus($something) $this->cannot('change-status', $something);
用法
PolicyProvider 可以通过容器访问
$container->get('brzez_access_policy.access_policy_provider')
控制器可以使用 Brzez\AccessPolicyBundle\Traits\AccessCheckerTrait,这将通过添加
- can(intent, object)
- cannot(intent, object)
- getPolicyProvider() 方法扩展控制器
它还添加了 twig 全局函数 - can(...) 和 cannot(...),可以使用如下方式使用它们
{% if can('view', someObject) %} i can view someObject {% endif %} {% if cannot('view', someObject) %} i cannot view someObject {% endif %}
示例
假设我们有 SomeEntity 并需要通过我们的策略检查 view 权限。
我们需要创建带有 canView 方法的 SomeEntityPolicy。
use Brzez\AccessPolicyBundle\Service\AccessPolicyInterface; class SomeEntityPolicy implements AccessPolicyInterface { public function canView(SomeEntity $entity) { // access logic here return false; } }
将策略链接到实体
在 app/config/services.yml
services: test_policy: class: AppBundle\SomeEntityPolicy tags: - {name: access_policy}
现在您可以在控制器中检查访问权限
use Brzez\AccessPolicyBundle\Traits\AccessCheckerTrait; class DefaultController extends Controller { use AccessCheckerTrait; /** * @Route("/", name="homepage") */ public function indexAction(Request $request) { // get $someObject from somewhere ... if($this->cannot('view', $someObject)){ throw new AccessDeniedException('...'); } // render view ... } }
您还可以在 twig 视图中检查访问权限
{% if can('view', someObject) %} i can view someObject {% endif %} {% if cannot('view', someObject) %} i cannot view someObject {% endif %}
变更日志
- 0.9.0 降低了类检查的严格性 - 使用 is_a(instanceof)而不是严格的 get_class == classname。这样它将适用于模拟实体