rheck/accesscontrol-bundle
用于控制用户访问的包。
Requires
- php: >= 5.3.3
- doctrine/orm: >=2.2.3,<2.4-dev
- symfony/symfony: >=2.3.0
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-28 13:40:48 UTC
README
此包是路由访问控制的简单解决方案。您可以选择使用包的默认策略或创建自己的自定义策略。
工作原理
您可以使用composer安装此包
composer require rheck/accesscontrol-bundle
或将包添加到您的Symfony项目的composer.json文件中。
安装包后,您需要将包添加到您的AppKernel.php文件中
// in AppKernel::registerBundles() $bundles = array( // ... new Rheck\AccessControlBundle\RheckAccessControlbundle(), // ... );
配置
如果您想使用默认的包策略,您必须创建权限数据库。
1. Doctrine Schema Update Command
php app/console doctrine:schema:update --force
2. 在数据库中直接创建(MySQL示例)
CREATE TABLE rheck_permissioncontexts ( `id` INT AUTO_INCREMENT NOT NULL, `name` VARCHAR(255) NOT NULL, `label` VARCHAR(255) NOT NULL, `description` VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id) ) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; CREATE TABLE rheck_permissions ( `id` INT AUTO_INCREMENT NOT NULL, `name` VARCHAR(255) NOT NULL, `label` VARCHAR(255) NOT NULL, `description` VARCHAR(255) DEFAULT NULL, `permissionContext_id` INT DEFAULT NULL, INDEX IDX_538F31584B364D6E (permissionContext_id), PRIMARY KEY (id) ) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
3. 实体
权限必须与实体用户或其他与用户有关系的实体相关联,这些实体将登录并实现一个接口。
示例
use Rheck\AccessControlBundle\Entity\PermissionAccessInterface; class User implements PermissionAccessInterface { protected $permissions; public function __construct() { $this->permissions = new ArrayCollection(); } public function addPermission(Permission $permission) { $this->permissions->add($permission); } public function getPermissions() { return $this->permissions; } }
4. config.yml
示例1:如果您想直接通过我的用户实体验证权限,配置如下
rheck_access_control: has_permissions: user
示例2:假设我有一个名为UserGroups的实体,它与用户有多对多关系。配置如下
rheck_access_control: has_permissions: user.userGroups
使用方法
您有两种方式来检查权限。
两种方式都有4个字段
1. 权限:可以是单个参数或数组;
2. 上下文:您可以通过上下文分组权限,默认值为“系统”;
3. 条件:您可以选择如何检查权限的条件,其值可以是“AND”或“OR”。默认值为“AND”;
4. 策略:您可以创建自己的验证策略。示例在文件末尾。
1. 通过注解验证
@PermissionAccess:您需要添加使用语句
use Rheck\AccessControl\Annotation\PermissionAccess;
示例1(使用默认包策略)
/** * @PermissionAccess("INDEX", context="DASHBOARD") */
在上面的示例中,我想检查我的登录用户是否有权限“INDEX”的上下文“DASHBOARD”允许访问。否则将抛出403 http错误消息。
示例2(使用默认包策略)
/** * @PermissionAccess({"VIEW", "VIEW_ALL"}, context="PROJECT", criteria="OR") */
在上面的示例中,我想检查我的登录用户是否允许访问在权限检查中添加的权限数组之一。注意:我只需要一个允许的权限,因为条件是“OR”。如果条件是“AND”,我必须在列出的每个权限上都允许。
2. 通过Twig验证
与“1. 通过注解验证”相同,我们有相同的参数,所以让我们为twig视图进行适配
示例1(类似于注解示例1)
{% if permissionAccess("INDEX", "DASHBOARD") %} You have permission to access. {% else %} You donot have permission to access. {% endif %}
示例2(类似于注解示例2)
{% if permissionAccess(["VIEW", "VIEW_ALL"], "PROJECT", "OR") %} You have permission to access. {% else %} You donot have permission to access. {% endif %}
创建自己的策略
要创建自己的验证策略,您必须遵循以下步骤
1. 创建策略文件
<?php namespace MyNamespace\Strategy; use Rheck\AccessControlBundle\Strategy\PermissionAccessStrategyInterface; class CustomStrategy implements PermissionAccessStrategyInterface { public function run($permissions, $context, $criteria) { // Validate the data as you want. $validatedData = true; return $validatedData; } }
您必须返回一个布尔值。
2. 将策略注册为服务
创建策略后,您必须将其注册为服务,如下所示
parameters: my.custom.strategy.class: MyNamespace\Strategy\CustomStrategy services: my.custom.strategy: class: %my.custom.strategy.class%
3. 使用自定义策略验证数据
3.1. 注解
/** * @PermissionAccess("DETAIL", strategy="my.custom.strategy") */
3.2. Twig
{% if permissionAccess("DETAIL", "SYSTEM", "AND", "my.custom.strategy") %} You have access. {% else %} You haven't access. {% endif %}