at / resource-access
此包最新版本(dev-master)没有可用的许可证信息。
Symfony ATResourceAccessBundle
dev-master
2013-08-16 13:06 UTC
Requires
- php: >=5.4
- symfony/framework-bundle: ~2.2
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