Простейший AuthManager

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Простейший AuthManager

Сообщение andku83 »

Нужно привязаться к готовой структуре БД с ролью в таблице user.
Предполагаю наследовать AuthManager и определять свою реализацию.
Возможно есть готовые решения?
Или кто предложит другой путь?
Notad
Сообщения: 78
Зарегистрирован: 2015.10.03, 16:30

Re: Простейший AuthManager

Сообщение Notad »

У меня через правило userGroup.

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

class UserGroupRule extends Rule
{

public $name = 'userGroup';

public function execute($user, $item, $params)
	{

	if(!Yii::$app->getUser()->getIsGuest())
		{
		$group = Yii::$app->getUser()->getIdentity()->getUser()->party;

		switch($item->name)
			{
			case 'administrator' :
				return $group == 'administrator';
			break;
			case 'manager' :
				return $group == 'administrator' || $group == 'manager';
			break;
			
			.....
А а auth_item для каждой роли это правило указывается.
Потом когда проверяется доступ оно срабатывает по полю $user->party
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Простейший AuthManager

Сообщение maleks »

Если роль записана в таблице пользователя, то это так сказать простой вариант, а не то что предлагает в общем RBAC(он привязки сам у себя хранит).
Совместить можно так:
В в конфиге приложения:

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

    'on ' . \yii\web\Application::EVENT_BEFORE_REQUEST => ['common\components\RbacService', 'init'], 
И сам хэлпер:

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

namespace common\components;

use Yii;

class RbacService
{
    /**
     * Initializing user's rights on the fly per every page request
     */
    public static function init()
    {
        $user = Yii::$app->user;
        if (!$user->isGuest) {
            $id = $user->id;
            $auth = Yii::$app->authManager;
            $auth->revokeAll($id);
            if ($role = $user->identity->role) {
                $auth->assign($auth->getRole($role), $id);
            }
        }
    }
}
Т.е. на лету ему эта роль(она должна существовать в базе рбак) будет присваиваться, а все остальное - разрешения, права, правила и т.д. как обычно в рбак.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Простейший AuthManager

Сообщение andku83 »

maleks писал(а): 2018.03.21, 08:35
Т.е. на лету ему эта роль(она должна существовать в базе рбак) будет присваиваться, а все остальное - разрешения, права, правила и т.д. как обычно в рбак.
а так что бы без таблиц(файлов) с ролями возможно?
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Простейший AuthManager

Сообщение maleks »

Если вообще без rbac, то можно же свой менеджер придумать, имплементирующий CheckAccessInterface
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Простейший AuthManager

Сообщение andku83 »

maleks писал(а): 2018.03.21, 15:32 Если вообще без rbac, то можно же свой менеджер придумать, имплементирующий CheckAccessInterface
Спасибо, так и сделал
Результат:

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

class AccessChecker implements CheckAccessInterface
{
    public function checkAccess($userId, $permissionName, $params = [])
    {
        if ($user = Yii::$app->user->identity) {
            return $user->role === $permissionName;
        }
        return false;
    }
}
и подключение:

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

    'components' => [
	...
        'user' => [
            'class' => yii\web\User::class,
            'identityClass' => common\models\User::class,
            'enableAutoLogin' => true,
            'accessChecker' => \common\components\accessChecker\AccessChecker::class,
        ],
    ],
Закрыто