Правила доступа Yii2 с использованием разных моделей
У меня проблемы с управлением доступом на основе ролей Yii2. В обычной настройке правило аутентификации имеет место при идентификации текущего пользователя. Как написано в документах. авторизация
В моем случае, как я могу настроить авторизацию (кроме основной функции), используя другой набор моделей? Вот мои настройки.
Таблица auth_assignment
[item_name
, user_id
] от миграции rbac, user
[id
] из миграции yii2. Я создал новую таблицу assignment
[user_id
относится к user
, rec_id
относится к recognition
из organization
].
Это сценарий. У меня есть роли admin
, organization-head
, member
, Как я могу проверить, если organization-head
, или же member
принадлежит их собственному модулю распознавания; не другие модули от других руководителей организаций?
Я использовал также фильтр контроля доступа к контексту от peixoto.
Вот мой код для проверки. RecognitionRule проверяет, есть ли пользователь user_id
равен личности пользователя; а также account_id
равно rec_id
, Второе условие говорит, принадлежит ли он к организации
/**
* Checks if ID matches user passed via params
*/
class RecognitionRule extends Rule
{
public $name = 'isRecognition';
/**
* @param string|integer $user the user ID.
* @param Item $item the role or permission that this rule is associated with
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
*/
public function execute($user, $item, $params)
{
if(isset($params['recognition'])){ //Directly specify the model you plan to use via param
$model = $params['recognition'];
}else{ //Use the controller findModel method to get the model - this is what executes via the behaviour/rules
$id = Yii::$app->request->get('id'); //Note, this is an assumption on your url structure.
$model = Yii::$app->controller->findModel($id); //Note, this only works if you change findModel to be a public function within the controller.
}
return \common\models\Assignment::find()->where(['rec_id' => $model->id, 'user_id' => $user])->exists();
}
}
Тем не менее, мне не разрешено выполнять действие. Есть какие-нибудь подсказки?
1 ответ
Я получил ответы. Я основал свой ответ на поведении AccessRule и параметрах rbac\Rule $
фрагмент RecognitionRule
/**
* @param string|integer $user the user ID.
* @param Item $item the role or permission that this rule is associated with
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
*/
public function execute($user, $item, $params)
{
if(isset($params['recognition'])){ //Directly specify the model you plan to use via param
$model = $params['recognition'];
} else{ //Use the controller findModel method to get the model - this is what executes via the behaviour/rules
$id = Yii::$app->request->get('id'); //Note, this is an assumption on your url structure.
}
return \common\models\Assignment::find()->where(['rec_id' => $id, 'user_id' => $user])->exists();
}
}
?>
RecognitionController
[
'class' => 'common\rbac\ContextAccessRule',
'modelClass' => 'frontend\models\recognition',
'allow' => true,
'actions' => ['view','update'],
'roles' => ['viewOwnRecognition', 'updateOwnRecognition'],
],
],
],
];