RBAC. У гостя все права.

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Закрыто
Аватара пользователя
nikudator
Сообщения: 29
Зарегистрирован: 2016.03.08, 19:47

RBAC. У гостя все права.

Сообщение nikudator »

Делаю велосипед RBAC по мануалу: https://habr.com/ru/post/235485/

Доступы для зарегистрированных пользователей работают, но вот у незарегистрированного все доступы.

web.php

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

   'authManager' => [
            'class' => 'yii\rbac\PhpManager',
            'defaultRoles' => ['user', 'redactor', 'moderator', 'admin', 'root'],
RbacController.php

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

namespace app\commands;

use Yii;
use yii\console\Controller;
use \app\rbac\UserGroupRule;

class RbacController extends Controller
{
    public function actionInit()
    {
        $authManager = \Yii::$app->authManager;
        $authManager->removeAll();

        // Create roles
        $guest = $authManager->createRole('guest');
        $user = $authManager->createRole('user');
        $redactor = $authManager->createRole('redactor');
        $moderator = $authManager->createRole('moderator');
        $admin = $authManager->createRole('admin');
        $root = $authManager->createRole('root');

        // Create simple, based on action{$NAME} permissions
        $login = $authManager->createPermission('login');
        $logout = $authManager->createPermission('logout');
        $emailconfirm = $authManager->createPermission('emailconfirm');
        $passwordrequest = $authManager->createPermission('passwordrequest');
        $resendverificationemail = $authManager->createPermission('resendverificationemail');
        $error = $authManager->createPermission('error');
        $auth = $authManager->createPermission('auth');
        $signup = $authManager->createPermission('signup');
        $index = $authManager->createPermission('index');
        $view = $authManager->createPermission('view');
        $update = $authManager->createPermission('update');
        $delete = $authManager->createPermission('delete');
        $create = $authManager->createPermission('create');
        $about = $authManager->createPermission('about');
        $contact = $authManager->createPermission('contact');


        // Add permissions in Yii::$app->authManager
        $authManager->add($login);
        $authManager->add($logout);
        $authManager->add($emailconfirm);
        $authManager->add($passwordrequest);
        $authManager->add($resendverificationemail);
        $authManager->add($auth);
        $authManager->add($error);
        $authManager->add($signup);
        $authManager->add($index);
        $authManager->add($view);
        $authManager->add($update);
        $authManager->add($delete);
        $authManager->add($create);
        $authManager->add($about);
        $authManager->add($contact);

        // Add rule, based on UserExt->group === $user->group
        $userGroupRule = new UserGroupRule();
        $authManager->add($userGroupRule);

        // Add rule "UserGroupRule" in roles
        $guest->ruleName = $userGroupRule->name;
        $user->ruleName = $userGroupRule->name;
        $redactor->ruleName = $userGroupRule->name;
        $moderator->ruleName = $userGroupRule->name;
        $admin->ruleName = $userGroupRule->name;
        $root->ruleName = $userGroupRule->name;

        // Add roles in Yii::$app->authManager
        $authManager->add($guest);
        $authManager->add($user);
        $authManager->add($redactor);
        $authManager->add($moderator);
        $authManager->add($admin);
        $authManager->add($root);

        // Add permission-per-role in Yii::$app->authManager
        // Guest
        $authManager->addChild($guest, $login);
        $authManager->addChild($guest, $signup);
        $authManager->addChild($guest, $emailconfirm);
        $authManager->addChild($guest, $passwordrequest);
        $authManager->addChild($guest, $resendverificationemail);
        $authManager->addChild($guest, $auth);
        $authManager->addChild($guest, $error);
        $authManager->addChild($guest, $index);
        $authManager->addChild($guest, $view);
        $authManager->addChild($guest, $about);
        $authManager->addChild($guest, $contact);

        // user
        $authManager->addChild($user, $logout);
        $authManager->addChild($user, $passwordrequest);
        $authManager->addChild($user, $guest);

        // redactor
        $authManager->addChild($redactor, $create);
        $authManager->addChild($redactor, $user);

        //moderator
        $authManager->addChild($moderator, $update);
        $authManager->addChild($moderator, $redactor);

        // admin
        $authManager->addChild($admin, $delete);
        $authManager->addChild($admin, $moderator);

        // root
        $authManager->addChild($root, $admin);
UserGroupRule.php

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

namespace app\rbac;

use Yii;
use yii\rbac\Rule;

class UserGroupRule extends Rule
{
    public $name = 'userGroup';

    public function execute($user, $item, $params)
    {
        if (!\Yii::$app->user->isGuest) {
          $group = \Yii::$app->user->identity->group;
          if ($item->name === 'root') {
                return $group == 'root';
            } elseif ($item->name === 'admin') {
                return $group == 'root' || $group == 'admin';
            } elseif ($item->name === 'moderator') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator';
            } elseif ($item->name === 'redactor') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor';
            } elseif ($item->name === 'user') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor' || $group == 'user';
            }
        }
        return true;
    }
}
В контроллере:

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

    public function beforeAction($action)
    {
        if (parent::beforeAction($action)) {
            if (!\Yii::$app->user->can($action->id)) {
                throw new ForbiddenHttpException('Отказано в доступе. Не достаточно прав.');
            }
            return true;
        } else {
            return false;
        }
    }
не бойся ночи скрывшей все вокруг, в ней рыщут двое: я, лиса Ахули и пес 3.14здец, таинственный мой друг.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: RBAC. У гостя все права.

Сообщение maleks »

Они там походу делают ошибку.
Оно ведь как работает:
Те defaultRoles предполагается что назначены всем по умолчанию.
И их применимость контролируется правилом, на эту роль накинутым, а они всем накинули $userGroupRule, который для гостя true всегда возвращает
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
nikudator
Сообщения: 29
Зарегистрирован: 2016.03.08, 19:47

Re: RBAC. У гостя все права.

Сообщение nikudator »

Блин, расскажи, как сделать правильно... Я себе моск уже сломал.
не бойся ночи скрывшей все вокруг, в ней рыщут двое: я, лиса Ахули и пес 3.14здец, таинственный мой друг.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: RBAC. У гостя все права.

Сообщение maleks »

Вот так

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

class UserGroupRule extends Rule
{
    public $name = 'userGroup';

    public function execute($user, $item, $params)
    {
        if (!\Yii::$app->user->isGuest) {
          $group = \Yii::$app->user->identity->group;
          if ($item->name === 'root') {
                return $group == 'root';
            } elseif ($item->name === 'admin') {
                return $group == 'root' || $group == 'admin';
            } elseif ($item->name === 'moderator') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator';
            } elseif ($item->name === 'redactor') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor';
            } elseif ($item->name === 'user') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor' || $group == 'user';
            }
        } else {
			return $item->name === 'guest';
		}
        return false;
    }
} 
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
nikudator
Сообщения: 29
Зарегистрирован: 2016.03.08, 19:47

Re: RBAC. У гостя все права.

Сообщение nikudator »

Спасибо тебе, добрый человек!
не бойся ночи скрывшей все вокруг, в ней рыщут двое: я, лиса Ахули и пес 3.14здец, таинственный мой друг.
Аватара пользователя
nikudator
Сообщения: 29
Зарегистрирован: 2016.03.08, 19:47

Re: RBAC. У гостя все права.

Сообщение nikudator »

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

        } else {
			return $item->name === 'guest';
		}
        return false;
Тогда не наследуются права гостя, но права от user до root наследуются нормально.

Так, тоже:

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

        } else {
			return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor' || $group == 'user' || $group == 'guest';
		}
        return false;
не бойся ночи скрывшей все вокруг, в ней рыщут двое: я, лиса Ахули и пес 3.14здец, таинственный мой друг.
Аватара пользователя
nikudator
Сообщения: 29
Зарегистрирован: 2016.03.08, 19:47

Re: RBAC. У гостя все права.

Сообщение nikudator »

В общем вот так вроде заработало:

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

class UserGroupRule extends Rule
{
    public $name = 'userGroup';

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

          //echo '<pre>'.var_export($item).'</pre>'; exit;

          if ($item->name === 'root') {
                return $group == 'root';
            } elseif ($item->name === 'admin') {
                return $group == 'root' || $group == 'admin';
            } elseif ($item->name === 'moderator') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator';
            } elseif ($item->name === 'redactor') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor';
            } elseif ($item->name === 'user') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor' || $group == 'user';
            } elseif ($item->name === 'guest') {
                return $group == 'root' || $group == 'admin' || $group == 'moderator' || $group == 'redactor' || $group == 'user' || $group == 'guest';
          }
        }
        else {
            return $item->name === 'guest';
        }
    }
}
не бойся ночи скрывшей все вокруг, в ней рыщут двое: я, лиса Ахули и пес 3.14здец, таинственный мой друг.
Закрыто