brzez/access-policy-bundle

v0.9.0 2016-07-15 17:55 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:14:42 UTC


README

概述

访问检查器,受Laravel启发。

它允许通过简单的 cancannot 方法检查访问权限,这些方法通过 brzez_access_policy.access_policy_provider 服务访问。

它还通过两个全局函数扩展了twig。

can 至少需要两个参数

  • 意图 - 你要检查什么访问权限,例如 viewedit
  • 对象 - 你要检查访问权限的对象 cannotcan 的逆操作(所以 !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。这样它将适用于模拟实体