yii2 rbac phpManager defaultRole не работает после обновления yii2 до 2.0.21 - PullRequest
0 голосов
/ 24 июня 2019

Окружающая среда: os: mac mojave php: 7.2.9 yii2: 2.0.21 - базовый шаблон

во-первых, мое приложение yii2 2.0.5 и все работает нормально. затем php обновлен до 7.2.9. но приложение идет ошибка

Неустранимая ошибка: невозможно использовать 'Object' в качестве имени класса, поскольку оно зарезервировано

затем yii2 обновлен до 2.0.21

тогда приложение yii2 работает нормально, но все пользователи могут получить доступ ко всем разрешениям или ролям

это мой 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

как описать в коде на эту роль сотрудники не имеют гранта для доступа к kelolaStaff но когда пользователь с ролью персонала вошел в систему и проверил с помощью Yii :: $ app-> user-> can ('kelolaStaff'), верните TRUE

1024 * Отредактировано * как описано ниже @Bizley: пока мое приложение заработает: 1. установить defaultRole просто штатный ... '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; }

1 Ответ

0 голосов
/ 24 июня 2019

На первую часть вашего вопроса ответил @ Sfili_81 в комментарии, но вы позаботились об этом, обновив Yii.

Что касается второй части:

Не задановсе ваши роли в defaultRoles в конфигурации для authManager.

Как описано в Guide :

Роль по умолчанию - это роль, которая назначается неявно всем пользователям

Таким образом, каждый пользователь (включая гостей) получил все эти роли по умолчанию в вашей конфигурации.Удалите этот параметр конфигурации и назначьте роли пользователям, которые должны их получить (подробности о том, как это сделать, описаны в разделе связанного руководства).

...