Нужно привязаться к готовой структуре БД с ролью в таблице user.
Предполагаю наследовать AuthManager и определять свою реализацию.
Возможно есть готовые решения?
Или кто предложит другой путь?
Простейший AuthManager
Re: Простейший AuthManager
У меня через правило userGroup.
А а auth_item для каждой роли это правило указывается.
Потом когда проверяется доступ оно срабатывает по полю $user->party
Код: Выделить всё
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;
.....
Потом когда проверяется доступ оно срабатывает по полю $user->party
Re: Простейший AuthManager
Если роль записана в таблице пользователя, то это так сказать простой вариант, а не то что предлагает в общем 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);
}
}
}
}
Re: Простейший AuthManager
Если вообще без rbac, то можно же свой менеджер придумать, имплементирующий CheckAccessInterface
Re: Простейший AuthManager
Спасибо, так и сделал
Результат:
Код: Выделить всё
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,
],
],