yii2 rbac phpManager defaultRole 在更新 yii2 到 2.0.21 后不工作
yii2 rbac phpManager defaultRole not working after update yii2 to 2.0.21
环境:
os: mac 莫哈韦
php:7.2.9
yii2: 2.0.21 - 基本模板
首先是我的 yii2 应用程序 2.0.5,一切正常。
然后 php 更新到 7.2.9。
但应用程序出错
致命错误:无法将 'Object' 用作 class 保留的名称
然后yii2更新到2.0.21
然后 yii2 app 运行 正常但所有用户都可以访问所有权限或角色
这是我的RbacController.php
<?php
namespace app\commands;
use Yii;
use yii\console\Controller;
class RbacController extends Controller
{
public function actionInit()
{
$permissions = [
/* template permission
'nama_permission' => 'deskripsi',
*/
'kelolaCuti' => 'Kelola Cuti',
'kelolaStaff' => 'Kelola data staff',
];
$roles = [
/* template role
'nama_role' => ['permission/role', ...],
*/
'staff' => [
'kelolaCuti'
],
'admin' => [
'staff',
'kelolaStaff',
],
'supervisor' => [
'admin',
],
'direksi'=>[
'supervisor'
],
'administrator' => [
'direksi'
],
'superuser' => [
'administrator'
]
];
// Siapkan authManager
$auth = Yii::$app->authManager;
$auth->removeAll();
$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);
// Tambahkan permission
foreach($permissions as $name => $description) {
$permission = $auth->createPermission($name);
$permission->description = $description;
$auth->add($permission);
}
// Tambahkan role
foreach($roles as $name => $children) {
$role = $auth->createRole($name);
$auth->add($role);
foreach($children as $child) {
$auth->addChild($role, $auth->getItem($child));
}
}
}
}
这是我的规则
<?php
namespace app\rbac;
use Yii;
use yii\rbac\Rule;
class UserGroupRule extends Rule
{
public $name = 'userGroup';
public function execute($user, $item, $params)
{
/* kode ROLES dari app\models\Staff
const ROLES = [
1 => 'Super User',
2 => 'Administrator',
3 => 'Direksi',
4 => 'Supervisor',
5 => 'Admin',
6 => 'Staff',
];
*/
if(!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->role;
if($item->name === 'superuser') {
return $group == 1;
} elseif($item->name === 'administrator') {
return in_array($group, [1, 2]);
} elseif($item->name === 'direksi') {
return in_array($group, [1, 2, 3]);
} elseif($item->name === 'supervisor') {
return in_array($group, [1, 2, 3, 4]);
} elseif($item->name === 'admin') {
return in_array($group, [1, 2, 3, 4, 5]);
} elseif($item->name === 'staff') {
return in_array($group, [1, 2, 3, 4, 5, 6]);
}
}
return false;
}
}
这是我的config/web.php
...
'authManager' => [
'class' => 'yii\rbac\PhpManager',
'defaultRoles' => ['superuser', 'administrator', 'direksi', 'supervisor', 'admin', 'staff'],
],
...
作为 rbac
中的组,用户 table 中有角色字段
喜欢在代码中描述
该角色员工无权访问 kelolaStaff
但是当具有员工角色的用户登录并使用 Yii::$app->user->can('kelolaStaff') return TRUE
检查时
已编辑
如下@Bizley 所补充:
同时让我的应用程序工作:
1. 设置 defaultRole 只是 staff
...
'authManager' => [
'class' => 'yii\rbac\PhpManager',
'supervisor', 'admin', 'staff'],
'defaultRoles' => ['staff'],
],
...
- 登录后手动分配角色
$auth = \Yii::$app->authManager;
$auth->revokeAll($this->_user->id);
switch ($this->_user->role) {
case Staff::ROLE_SUPERUSER :
if (!Yii::$app->user->can('superuser')){
$grantRole = $auth->getRole('superuser');
$auth->assign($grantRole, $this->_user->id);
}
break;
case Staff::ROLE_ADMINISTRATOR :
if (!Yii::$app->user->can('administrator')){
$grantRole = $auth->getRole('administrator');
$auth->assign($grantRole, $this->_user->id);
}
break;
case Staff::ROLE_STAFF :
if (!Yii::$app->user->can('staff')){
$grantRole = $auth->getRole('staff');
$auth->assign($grantRole, $this->_user->id);
}
break;
}
@Sfili_81 在评论中回答了你问题的第一部分,但你通过更新 Yii 解决了这个问题。
至于第二部分:
不要在 authManager
的配置中设置 defaultRoles
中的所有角色。
如Guide所述:
A default role is a role that is implicitly assigned to all users
因此,默认情况下,每个用户(包括来宾)都通过您的配置获得了所有这些角色。
删除此配置选项并将角色分配给应该获得它们的用户(详细信息如何做在链接指南的部分中有描述)。
环境: os: mac 莫哈韦 php:7.2.9 yii2: 2.0.21 - 基本模板
首先是我的 yii2 应用程序 2.0.5,一切正常。 然后 php 更新到 7.2.9。 但应用程序出错
致命错误:无法将 'Object' 用作 class 保留的名称
然后yii2更新到2.0.21
然后 yii2 app 运行 正常但所有用户都可以访问所有权限或角色
这是我的RbacController.php
<?php
namespace app\commands;
use Yii;
use yii\console\Controller;
class RbacController extends Controller
{
public function actionInit()
{
$permissions = [
/* template permission
'nama_permission' => 'deskripsi',
*/
'kelolaCuti' => 'Kelola Cuti',
'kelolaStaff' => 'Kelola data staff',
];
$roles = [
/* template role
'nama_role' => ['permission/role', ...],
*/
'staff' => [
'kelolaCuti'
],
'admin' => [
'staff',
'kelolaStaff',
],
'supervisor' => [
'admin',
],
'direksi'=>[
'supervisor'
],
'administrator' => [
'direksi'
],
'superuser' => [
'administrator'
]
];
// Siapkan authManager
$auth = Yii::$app->authManager;
$auth->removeAll();
$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);
// Tambahkan permission
foreach($permissions as $name => $description) {
$permission = $auth->createPermission($name);
$permission->description = $description;
$auth->add($permission);
}
// Tambahkan role
foreach($roles as $name => $children) {
$role = $auth->createRole($name);
$auth->add($role);
foreach($children as $child) {
$auth->addChild($role, $auth->getItem($child));
}
}
}
}
这是我的规则
<?php
namespace app\rbac;
use Yii;
use yii\rbac\Rule;
class UserGroupRule extends Rule
{
public $name = 'userGroup';
public function execute($user, $item, $params)
{
/* kode ROLES dari app\models\Staff
const ROLES = [
1 => 'Super User',
2 => 'Administrator',
3 => 'Direksi',
4 => 'Supervisor',
5 => 'Admin',
6 => 'Staff',
];
*/
if(!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->role;
if($item->name === 'superuser') {
return $group == 1;
} elseif($item->name === 'administrator') {
return in_array($group, [1, 2]);
} elseif($item->name === 'direksi') {
return in_array($group, [1, 2, 3]);
} elseif($item->name === 'supervisor') {
return in_array($group, [1, 2, 3, 4]);
} elseif($item->name === 'admin') {
return in_array($group, [1, 2, 3, 4, 5]);
} elseif($item->name === 'staff') {
return in_array($group, [1, 2, 3, 4, 5, 6]);
}
}
return false;
}
}
这是我的config/web.php
...
'authManager' => [
'class' => 'yii\rbac\PhpManager',
'defaultRoles' => ['superuser', 'administrator', 'direksi', 'supervisor', 'admin', 'staff'],
],
...
作为 rbac
中的组,用户 table 中有角色字段喜欢在代码中描述 该角色员工无权访问 kelolaStaff 但是当具有员工角色的用户登录并使用 Yii::$app->user->can('kelolaStaff') return TRUE
检查时已编辑
如下@Bizley 所补充:
同时让我的应用程序工作: 1. 设置 defaultRole 只是 staff
...
'authManager' => [
'class' => 'yii\rbac\PhpManager',
'supervisor', 'admin', 'staff'],
'defaultRoles' => ['staff'],
],
...
- 登录后手动分配角色
$auth = \Yii::$app->authManager;
$auth->revokeAll($this->_user->id);
switch ($this->_user->role) {
case Staff::ROLE_SUPERUSER :
if (!Yii::$app->user->can('superuser')){
$grantRole = $auth->getRole('superuser');
$auth->assign($grantRole, $this->_user->id);
}
break;
case Staff::ROLE_ADMINISTRATOR :
if (!Yii::$app->user->can('administrator')){
$grantRole = $auth->getRole('administrator');
$auth->assign($grantRole, $this->_user->id);
}
break;
case Staff::ROLE_STAFF :
if (!Yii::$app->user->can('staff')){
$grantRole = $auth->getRole('staff');
$auth->assign($grantRole, $this->_user->id);
}
break;
}
@Sfili_81 在评论中回答了你问题的第一部分,但你通过更新 Yii 解决了这个问题。
至于第二部分:
不要在 authManager
的配置中设置 defaultRoles
中的所有角色。
如Guide所述:
A default role is a role that is implicitly assigned to all users
因此,默认情况下,每个用户(包括来宾)都通过您的配置获得了所有这些角色。 删除此配置选项并将角色分配给应该获得它们的用户(详细信息如何做在链接指南的部分中有描述)。