jlorente / yii2-roles
一个包含框架中角色概念的 Yii2 扩展。用于处理只有某些角色允许访问控制器动作和过滤数据库资源。
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。