Использую шаблон advanced и пользуюсь его моделью User. Для authManager`а использую класс DbManager.
Для начала описываю общую идею. В системе возможны 3 роли пользователей: admin, arbitrator и editor. В админке:
- пользователи с ролью admin могут создавать, просматривать профили и редактировать профили любых пользователей
- пользователи, которые регистрируются через форму на сайте, автоматически получают роль arbitrator и в админке могут создавать пользователей с ролью editor, могут просматривать и редактировать профили только тех пользователей, которых они создали (для этого в модели User есть свойство parent_id: для admin и arbitrator - 0, а для editor - id пользователя, который его создал)
Код: Выделить всё
$auth = Yii::$app->authManager;
$rule = new AccessRule;
$auth->add($rule);
$adminRole = $auth->getRole('admin');
$arbitratorRole = $auth->getRole('arbitrator');
$canManagePermit = $auth->createPermission('canManage');
$canManagePermit->description = 'Can manage';
$auth->add($canManagePermit);
$canManageOwnPermit = $auth->createPermission('canManageOwn');
$canManageOwnPermit->description = 'Can manage own users';
$canManageOwnPermit->ruleName = $rule->name;
$auth->add($canManageOwnPermit);
$auth->addChild($canManageOwnPermit, $canManagePermit);
$auth->addChild($arbitratorRole, $canManageOwnPermit);
$auth->addChild($adminRole, $canManagePermit);
$auth->addChild($adminRole, $arbitratorRole);
Код: Выделить всё
class AccessRule extends Rule
{
public $name = 'canManageOwn';
public function execute($userId, $item, $params)
{
if (isset($params['parent_id']) && ($params['parent_id'] == $userId)) {
return true;
} else {
return false;
}
}
}
Решил проверить результаты на actionView в backend\controllers\UserController. Вот что там написано:
Код: Выделить всё
public function actionView($id)
{
$model = $this->findModel($id);
if (!Yii::$app->user->can('canManageOwn', ['parent_id' => $model->parent_id])) {
throw new ForbiddenHttpException('Ouuups!');
}
return $this->render('view', [
'model' => $model,
]);
}
Поэтому прошу ткнуть носом в место, где я допустил ошибку.
Ну, и чтобы 2 раза не вставать: так и не смог добиться хотя бы такого же результата, когда описывал доступ к действию в behavior в настройках AccessControl. Писал туда вот что:
Код: Выделить всё
[
'actions' => ['view'],
'allow' => true,
'matchCallback' => function ($rule, $action) {
$id = Yii::$app->request->get('id');
return Yii::$app->user->can('canManageOwnUsers', ['parent_id' => User::getParentIdByUserId($id)]);
}
],
Надеюсь на помощь, заранее благодарю.