aminkt / yii2-db-rbac
YII2中的动态访问控制
Requires
- yiisoft/yii2: *
README
此仓库是从developeruz/yii2-db-rbac分叉而来。
由于我们的需求,此分支已经从主仓库更改,因此请先喜欢主仓库以支持他们。
俄语版本在此处
在不修改代码的情况下创建Yii2访问控制的简单方法。
此模块允许通过UI创建Yii角色基础访问(RBAC)的角色和规则。它还允许通过UI分配用户的角色和规则。通过模块规则检查访问的行为。
集成
安装指南
$ php composer.phar require developeruz/yii2-db-rbac "*"
要正确工作,您必须在应用程序配置文件中配置模块authManager
(对于高级应用程序为common/config/main.php
,对于基本应用程序为config/web.php
和config/console
)
'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], ... ]
运行迁移以创建DbManager
表(这意味着应用程序已经配置了数据库连接)
$ yii migrate --migrationPath=@yii/rbac/migrations/
添加模块
将模块包含到配置文件中(对于高级应用程序为backend/config/main.php
,对于基本应用程序为config/web.php
)
'modules' => [ 'permit' => [ 'class' => 'developeruz\db_rbac\Yii2DbRbac', ], ],
如果您想设置布局,请按照以下方式操作
'modules' => [ 'permit' => [ 'class' => 'developeruz\db_rbac\Yii2DbRbac', 'layout' => '//admin' ], ],
如果您使用CNC,请确保您有正确的模块路由规则
'<module:\w+>/<controller:\w+>/<action:(\w|-)+>' => '<module>/<controller>/<action>', '<module:\w+>/<controller:\w+>/<action:(\w|-)+>/<id:\d+>' => '<module>/<controller>/<action>',
添加链接
/permit/access/role - 管理角色
/permit/access/permission - 管理访问
分配角色给用户
该模块还提供了一个界面,用于通过UI将角色分配给用户。
为了正确工作,必须在模块参数中指定User
类。
'modules' => [ 'permit' => [ 'class' => 'app\modules\db_rbac\Yii2DbRbac', 'params' => [ 'userClass' => 'app\models\User' ] ], ],
用户类应实现developeruz\db_rbac\interfaces\UserRbacInterface
。在大多数情况下,您必须添加函数getUserName()
,它应返回用户名。
use developeruz\db_rbac\interfaces\UserRbacInterface; class User extends ActiveRecord implements IdentityInterface, UserRbacInterface { ... public function getUserName() { return $this->username; } }
要管理id=1的用户的角色,请访问/permit/user/view/1
最简单的方法是将它作为按钮添加到用户的GridView
中。
echo GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'username', 'email:email', ['class' => 'yii\grid\ActionColumn', 'template' => '{view} {update} {permit} {delete}', 'buttons' => [ 'permit' => function ($url, $model) { return Html::a('<span class="glyphicon glyphicon-wrench"></span>', Url::to(['/permit/user/view', 'id' => $model->id]), [ 'title' => Yii::t('yii', 'Change user role') ]); }, ] ], ], ]);
您还可以在代码中为用户分配角色,例如在用户创建时。
$userRole = Yii::$app->authManager->getRole('name_of_role'); Yii::$app->authManager->assign($userRole, $user->getId());
您还可以通过User类中的can()
方法在代码中检查用户是否有权限
Yii::$app->user->can($permissionName);
$permissionName - 可以是角色名称或权限名称。
配置模块的访问控制
在配置中,您可以设置具有模块功能访问权限的角色列表。
'modules' => [ 'permit' => [ 'class' => 'app\modules\db_rbac\Yii2DbRbac', 'params' => [ 'userClass' => 'app\models\User', 'accessRoles' => ['admin'] ] ], ],
通过模块规则检查访问的行为
使用此行为,您不需要在每个操作中编写Yii::$app->user->can($permissionName)
。行为将自动检查。对于与第三方模块的访问控制也非常有用。
配置行为
如果您想自动检查访问,您必须将行为包含到应用程序配置文件中。
use developeruz\db_rbac\behaviors\AccessBehavior; 'as AccessBehavior' => [ 'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(), ]
在EVENT_BEFORE_ACTION
上,行为将检查当前用户(Yii::$app->user
)对操作的访问权限。如果满足以下条件,则操作允许:
- 用户有权访问操作(规则:模块/控制器/操作)
- 用户有权访问控制器中的任何操作(规则:模块/控制器)
- 用户有权访问模块中的任何操作(规则:模块)
拒绝访问时的重定向
默认情况下,如果用户没有权限,行为将抛出ForbiddenHttpException
。应用程序可以按需处理此异常。
您还可以配置将未授权用户重定向到的login_url
,或当访问被拒绝时重定向用户的redirect_url
。
'as AccessBehavior' => [ 'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(), 'redirect_url' => '/forbidden', 'login_url' => Yii::$app->user->loginUrl ]
配置默认访问规则
连接行为后,只有具有特定权限的授权用户才能访问。您可以在配置文件中以与控制器(AccessControl
)相同的方式创建默认访问权限。
'as AccessBehavior' => [ 'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(), 'rules' => ['site' => [ [ 'actions' => ['login', 'index'], 'allow' => true, ], [ 'actions' => ['about'], 'allow' => true, 'roles' => ['admin'], ], ] ] ]
在本例中,任何用户都可以访问site/login
和site/index
,只有具有admin
角色的用户才能访问site/about
。配置中描述的规则优先于动态可配置的规则。
配置行为责任区域
默认规则是“除非允许,否则全部禁止”。如果行为只保护特定路由,其他所有路由对所有用户都应可访问,请设置protect
参数。
'as AccessBehavior' => [ 'class' => \developeruz\db_rbac\behaviors\AccessBehavior::className(), 'protect' => ['admin', 'user', 'site/about'], 'rules' => [ 'user' => [['actions' => ['login'], 'allow' => true ], ['actions' => ['logout'], 'roles' => ['@'], 'allow' => true ]] ] ],
在本例中,行为将仅检查用户访问以下路径的权限:以admin
、user
和site / about
开头的路径。所有其他路由对所有用户都可用(不受行为验证)。如示例所示,protect
参数可以与rules
参数结合使用。
贡献
贡献是欢迎
的,并将得到全部认可
。我接受通过Pull Requests的贡献。请参阅贡献指南获取详细信息。
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。