Дублирование правил при работе с RBAC

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Дублирование правил при работе с RBAC

Сообщение Aleksey_ZX »

Воспользовался статьей http://habrahabr.ru/post/235485/ для создания правил. И в документации https://github.com/yiisoft/yii2/blob/ma ... ization.md в принципе написано тоже.
Вопрос в следующем, почему в RBAC не применяются наследуемые правила??
те. при генерации правил в RbacController используются следующие зависимости:

Код: Выделить всё

        $authManager->addChild($role['user'], $role['guest']);

        $authManager->addChild($role['author'], $role['user']);
        $authManager->addChild($role['author'], $permission['create']);

        $authManager->addChild($role['moderator'], $role['author']);
        $authManager->addChild($role['moderator'], $permission['update']);

        $authManager->addChild($role['admin'], $role['moderator']);
        $authManager->addChild($role['admin'], $permission['delete']);
те администратор, наследует правило от модератора и так до Гостя,
А для того, что бы правила сработали необходимо снова прописать в UserGroupRule эту же зависимость return $group == 'guest' || $group == 'user' || $group == 'moderator' || $group == 'author' || $group == 'admin';

Код: Выделить всё

 public function execute($user, $item, $params)
    {
        $group = (!\Yii::$app->user->isGuest)? \Yii::$app->user->identity->group  : 'guest';
            $group = \Yii::$app->user->identity->group;


            if ($item->name === 'admin') {
                return $group == 'admin';
            }
            elseif ($item->name == 'author') {
                return $group == 'admin' ||  $group == 'author';
            }
            elseif ($item->name == 'moderator') {
                return $group == 'moderator' ||  $group == 'author' ||  $group == 'admin';
            }
            elseif ($item->name == 'user') {
                return $group == 'user' || $group == 'moderator' ||  $group == 'author' ||  $group == 'admin';
            }
            elseif ($item->name == 'guest') {
                return $group == 'guest' || $group == 'user' || $group == 'moderator' ||  $group == 'author' ||  $group == 'admin';

            }
       return false;
}
Как мне кажется такого не должно быть. Может я, что не знаю? Но все что я читал предлагает такое использование RBAC.
Какие есть мысли?
Аватара пользователя
Серёга
Сообщения: 41
Зарегистрирован: 2013.08.02, 10:15

Re: Дублирование правил при работе с RBAC

Сообщение Серёга »

Добрый день, я делал вот так

Код: Выделить всё

...
public $roles = [];

    public function execute($user, $item, $params) {
        if (!Yii::$app->user->isGuest) {
            $activeRole = current(Yii::$app->authManager->getRolesByUser($user));
            return $activeRole->name == $item->name or isset($this->getChildrens($activeRole->name)[$item->name]);
        }
        return false;
    }
    
    public function getChildrens($roleName) {
        $children = Yii::$app->authManager->getChildren($roleName);
        if ($children !== []) {
            foreach ($children as $value) {
                $this->roles[$value->name] = $value->name;
                $this->getChildrens($value->name);
            }
        }
        return $this->roles;
    }
...
Ответить