jlorente/yii2-roles

一个包含框架中角色概念的 Yii2 扩展。用于处理只有某些角色允许访问控制器动作和过滤数据库资源。

安装: 77

依赖项: 1

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 0

开放问题: 0

类型:yii2-extension

0.1.2 2017-07-19 19:13 UTC

This package is auto-updated.

Last update: 2024-09-10 05:25:58 UTC


README

一个包含框架中角色概念的 Yii2 扩展。用于处理只有某些角色允许访问控制器动作和过滤数据库资源。

角色存储设计已优化,以使用单个数据库字段,遵循“位字段”或“标志”的数据结构,可以容纳大量角色以及它们的所有可能组合,占用整数的空间。

安装

在 composer.json 文件中将包作为依赖项包含。

要安装,请运行

$ php composer.phar require jlorente/yii2-roles "*"

或添加

...
    "require": {
        // ... other configurations ...
        "jlorente/yii2-roles": "*"
    }

到您的 composer.json 文件的 require 部分并从您的项目目录运行以下命令。

$ composer update
$ ./yii migrate --migrationPath=@vendor/jlorente/yii2-roles/src/migrations

迁移

应用包迁移

$ ./yii migrate --migrationPath=@vendor/jlorente/yii2-roles/src/migrations

或在您的项目中扩展此迁移,然后像通常一样应用它。

您可以通过覆盖 roleableTableName() 和 roleFieldName() 方法来提供其他表和字段名,以存储角色值。

模块设置

您必须将此模块添加到应用配置文件的应用模块和引导部分,以便使其工作。

../your_app/config/main.php

return [
    //Other configurations
    'modules' => [
        //Other modules
        'roles' => [
            'class' => 'jlorente\roles\Module'
             //options
             , 'user' => 'jlorente\roles\web\User'
             , 'roles' => ['Admin', 'User', 'Teacher']
             , 'matchAgainstSession' => false
         ]
    ],
    'bootstrap' => [
        //Other bootstrapped modules
        , 'roles'
    ]
]

选项

user

user 参数强制应用使用模块中包含的 web User 类,允许使用不同角色进行用户会话的身份验证。这意味着例如,拥有两个角色的用户可以仅使用其中一个角色访问应用。

当您正在构建具有前端和后端部分的 应用时,您不希望它们之间共享登录,这很有用。

roles

角色数组可以包含任何标量值,但它们必须在整个集合中是唯一的。

这些返回值代表您的角色值。Roleable 的内部值根据集合的顺序设置,遵循标志字段的规则。因此 [role0, role1, role2, ..., roleN] 将成为 [1, 2, 4, ..., (1 << N)]

您可以在数组的末尾添加新角色,而之前创建的任何内容都不会受到影响,但请注意,在使用后更改集合的顺序会导致先前分配的角色现在具有不同的值,因此请不要设置和使用了角色后更改其顺序。

matchAgainstSession

如果此参数设置为 true,您将必须指定在登录时 Web 用户将拥有的角色。控制器动作的访问规则将匹配分配给 Web 用户的角色,而不是身份模型的角色。

使用

Roleable 类

拥有角色属性的 ActiveRecord 类(通常是用户表和 User 类)必须实现 RoleableInterface。

该包附带一个 RoleableTrait,可以在实现此接口的类中使用,以添加所需方法的基本实现。

例如

./common/models/User.php

namespace common\models;

use jlorente\roles\models\RoleableTrait;
use jlorente\roles\models\RoleableInterface;
 
class User extends yii\db\ActiveRecord implements RoleableInterface {
    
    use RoleableTrait;

    //class content...
}

为 Roleable 分配角色

您可以使用 Role 类轻松地为 Roleable 对象添加角色。

根据最后一个示例

$user = new User();
jlorente\roles\models\Role::sAssign($user, 'Admin');
jlorente\roles\models\Role::sAssign($user, 'User');
$user->save();

控制器访问控制

您可以使用模块的 AccessControl 类来过滤对控制器动作的访问。

./frontend/controllers/SomeController.php

namespace frontend\controllers;

use yii\helpers\ArrayHelper;
use jlorente\roles\filters\AccessControl;
 
class SomeController extends yii\web\Controller {

    /**
     * @inheritdoc
     */
    public function behaviors() {
        return ArrayHelper::merge(parent::behaviors(), [
                    'access' => [
                        'class' => AccessControl::className(),
                        'rules' => [
                            [
                                'actions' => ['create', 'update', 'delete'],
                                'allow' => true,
                                'roles' => ['@'],
                                'userRoles' => ['Admin']
                            ],
                            [
                                'actions' => ['index', 'read'],
                                'allow' => true,
                                'roles' => ['@'],
                                'userRoles' => ['Admin', 'User'],
                                'matchAgainstSession' => true
                            ]
                        ],
                    ]
        ]);
    }
}

通过指定 "userRoles" 属性,您可以定义哪些角色可以访问动作。

如您在上述示例中看到的,您可以覆盖 Module 类中定义的单个规则 matchAgainstSession 属性。

将控制器访问与会话匹配

如前所述,将matchAgainstSession属性设置为true表示会话数据必须存储已登录的角色。

这是通过在登录之前设置网络用户的角色来实现的。

class LoginForm extends Model {

    public $user;
    public $username;
    public $password;
    public $rememberMe = true;

    //Class content....

    public function login() {
        if ($this->validate()) {
            Yii::$app->user->setRolesAsTag('Admin');
            $result = \Yii::$app->user->login($this->user, $this->rememberMe ? 3600 * 24 * 30 : 0);
            return $result;
        } else {
            return false;
        }
    }
}

手动不设置角色将导致会话以由身份模型拥有的所有角色进行登录。

进一步考虑

将角色定义为常量是一种好习惯,以避免拼写角色标签时的错误。

./your_app/config/main.php

define('ROLE_ADMIN', 'Admin');
define('ROLE_DIRECTOR', 'Director');
define('ROLE_USER', 'User');

然后使用这些常量来配置模块、分配用户角色、定义访问规则等...

许可

版权所有 © 2016 José Lorente Martín jose.lorente.martin@gmail.com

许可协议为MIT许可。详细信息请参阅LICENSE.txt。