at/resource-access

此包最新版本(dev-master)没有可用的许可证信息。

Symfony ATResourceAccessBundle

dev-master 2013-08-16 13:06 UTC

This package is not auto-updated.

Last update: 2024-09-23 13:59:54 UTC


README

安装

步骤 1: 使用 composer 下载 ResourceAccessBundle

在 composer.json 中添加 ResourceAccessBundle

{
    "require": {
        "at/resource-access": "dev-master"
    }
}

现在运行以下命令下载捆绑包

~ php composer.phar update at/resource-access

Composer 将将捆绑包安装到项目的 vendor/at 目录。

步骤 2: 启用捆绑包

在 kernel 中启用捆绑包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new AT\ResourceAccessBundle\ATResourceAccessBundle(),
    );
}

步骤 3: 在 config.yml 中将你的用户类添加到 doctrine 的 resolve_target_entities

    doctrine:
        orm:
            resolve_target_entities:
                AT\ResourceAccessBundle\Entity\Requester: Acme\UserBundle\Entity\User

步骤 4: 使你的用户类实现 RequesterInterface

<?php
// src/Acme/UserBundle/Entity/User.php

namespace Acme/UserBundle/Entity

// ...
use AT\ResourceAccessBundle\Model\RequesterInterface;

class User implements RequesterInterface
{
    // your content here
}

步骤 5: 创建你的资源实体,它实现了 ResourceInterface,并将映射添加到我们的 Resource 类中,如下所示

<?php
// src/Acme/YourBundle/Entity/MyResource.php

namespace Acme\YourBundle\Entity\

use Doctrine\ORM\Mapping as ORM;
use AT\ResourceAccessBundle\Entity\Resource;
use AT\ResourceAccessBundle\Model\ResourceInterface;

/**
 * @ORM\Entity()
 * @ORM\Table(name="my_resources")
 */
class MyResource implements ResourceInterface
{
    // ...

    /**
     * @ORM\OneToOne(targetEntity="AT\ResourceAccessBundle\Entity\Resource", cascade={"persist"})
     */
    protected $resource;

    // ...

    public function __construct()
    {
        $this->resource  = new Resource();
    }

    // ...

    /**
     * @return Resource
     */
    public function getResource()
    {
        return $this->resource;
    }

    // ...

步骤 6: 使用以下命令更新你的模式

~ php app/console doctrine:schema:update --force

步骤 7: 在 config.yml 中为每个资源类定义你的角色层次结构,如下所示

at_resource_access:
    resources:
        Acme/YourBundle/Entity/MyResource:
            role_hierarchy:
                ROLE_ADMIN: [ ROLE_EDIT ]
                ROLE_EDIT:  [ ROLE_READ ]
注意

第一个角色(在这种情况下是 ROLE_ADMIN)将被视为主角色,并且它将有权访问定义的任何其他角色。如果您添加另一个父角色如下

Acme/YourBundle/Entity/MyResource:
    role_hierarchy:
        ROLE_ADMIN:     [ ROLE_EDIT ]
        ROLE_EDIT:      [ ROLE_READ ]
        ROLE_REVIEW:    [ ROLE_READ_REVIEW, ROLE_EDIT_REVIEW ]

ROLE_REVIEW 将被视为 ROLE_ADMIN 的子角色,即使您没有这样定义,所以请始终确保角色之间有联系,以消除任何可能的混淆。

如何使用 ResourceAccessBundle

您现在可以使用管理器来管理资源上的角色

<?php
// src/Acme/YourBundle/Controller/MyResourceController.php

    // ...
    $resourceAccessManager = $this->get('resource_access_manager');

    /**
     * Grants access to user for specified resource.
     * $grantedBy is optional
     */
    $resourceAccessManager->grantAccess($user, $resource, ['array', 'of', 'accesses'], $grantedBy);

    /**
     * Returns true if user has specified access for resource, otherwise returns false
     * $user is optional
     * If $user is not provided the method will use the logged in user from security.context
     */
    $resourceAccessManager->isGranted($access, $resource, $user);

    /**
     * Replaces whatever accesses the user has with the provided ones
     * $grantedBy is optional
     */
    $resourceAccessManager->updateAccessLevels($user, $resource, ['array', 'of', 'accesses'], $grantedBy);

    /**
     * Remove specified user accesses for specified resource
     */
    $resourceAccessManager->removeAccessLevels($user, $resource, ['array', 'of', 'accesses', 'to', 'be', 'removed']);

    /**
     * Removes all user accesses for specified resource
     */
    $resourceAccessManager->removeAccess($user, $resource);

测试

为了运行测试,您必须在 config_test.yml 中添加以下行

    doctrine:
        orm:
            resolve_target_entities:
                AT\ResourceAccessBundle\Entity\Requester: AT\ResourceAccessBundle\Tests\Entity\Requester
            mappings:
                requester:
                    type: annotation
                    dir: %kernel.root_dir%/../vendor/at/resource-access/AT/ResourceAccessBundle/Tests/Entity
                    alias: Requester
                    prefix: AT\ResourceAccessBundle\Tests\Entity
                    is_bundle: false

现在运行此命令以运行测试

~ phpunit -c app vendor/at/resource-access/AT/ResourceAccessBundle/Tests