yii2 rbac phpManager defaultRole在将yii2更新为2.0.21后不起作用

时间:2019-06-24 01:55:35

标签: yii2 rules rbac

环境: 操作系统:mac mojave 的PHP:7.2.9 yii2:2.0.21-基本模板

首先是我的yii2应用2.0.5,一切正常。 然后php更新到7.2.9。 但是应用程序出错

致命错误:无法使用“对象”作为类名,因为它已保留

然后yii2更新为2.0.21

然后yii2应用正常运行,但所有用户都可以访问所有权限或角色

这是我的RbacController.php

BasePermission.__subclasses__()

这是我的规则

<?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));
            }
        }
    }
}

这是我的config / web.php

<?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;
    }
}

用户表中的角色字段作为rbac中的组

喜欢用代码描述 该角色员工无权访问kelolaStaff 但是当具有角色职员的用户登录并用Yii :: $ app-> user-> can('kelolaStaff')检查时返回TRUE

已编辑

如下面@Bizley所述:

同时让我的App工作: 1.设置defaultRole只是职员

...
'authManager' => [
            'class' => 'yii\rbac\PhpManager',
            'defaultRoles' => ['superuser', 'administrator', 'direksi', 'supervisor', 'admin', 'staff'],
        ],
...
  1. 登录后手动分配角色
...
'authManager' => [
'class' => 'yii\rbac\PhpManager',
          'supervisor', 'admin', 'staff'],
            'defaultRoles' => ['staff'],
        ],
...

1 个答案:

答案 0 :(得分:0)

@ Sfili_81已在评论中回答了问题的第一部分,但您通过更新Yii来解决了该问题。

第二部分:

不要在defaultRoles的配置中的authManager中设置所有角色。

Guide中所述:

  

默认角色是隐式分配给所有用户

的角色

因此,默认情况下,每个用户(包括来宾)在您的配置中都具有所有这些角色。 删除此配置选项,并将角色分配给应该获得该角色的用户(有关详细信息,请参见链接的“指南”部分中的说明)。