У меня возникли проблемы с частью входа. Я читаю эту тему: http://www.yiiframework.com/wiki/771/rbac-super-simple-with-admin-and-user/. Затем я следую его шагам, но на шаге 6. он конфигурируется только для одного контроллера. У меня есть модуль под названием Admin с множеством контроллеров, и я не знаю, как применить этот контроль доступа ко всему модулю. Может кто-нибудь мне помочь ? Извините за мой плохой английский.Контроль доступа модуля в Yii2
ответ
Вы можете создать AdminController
класс, который будет проходит yii\web\Controller
где вы определяете правила доступа в behaviors
способом и сделать другие контроллеры модуля расширить метод AdminController
и переопределить behaviors
так:
public function behaviors()
{
return \yii\helpers\ArrayHelper::merge(parent::behaviors(), [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
]);
}
Здесь parent::behaviors()
являются поведение от AdminController
, которые определяют правила доступа по умолчанию, и вы объединяете их с определенным поведением в вашем дочернем контроллере. Это дает вам возможность переопределить некоторые правила доступа, если вам нужно.
сделать пользовательскую модель AccessRules.php
, как показано ниже:
<?php
namespace app\models;
class AccessRules extends \yii\filters\AccessRule
{
/**
* @inheritdoc
*/
protected function matchRole($user)
{
if (empty($this->roles)) {
return true;
}
foreach ($this->roles as $role) {
if ($role === '?') {
if ($user->getIsGuest()) {
return true;
}
} elseif ($role === '@') {
if (!$user->getIsGuest()) {
return true;
}
// Check if the user is logged in, and the roles match
} elseif (!$user->getIsGuest() && (int)$role === $user->identity->user_role) {
return true;
}
}
return false;
}
}
?>
Теперь откройте ваш контроллер сайта и добавьте следующий код в поведении фикции части:
use app\models\AccessRules;
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
// We will override the default rule config with the new AccessRule class
'ruleConfig' => [
'class' => AccessRules::className(),
],
'only' => ['create', 'update', 'delete','index'],
'rules' => [
[
'actions' => ['create', 'update', 'delete','index'],
'allow' => true,
// Allow admin to create
'roles' => [
'1'
],
]
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
для большей ясности, вы использовали 'user_role'. Роль 'column' создается со значением по умолчанию' 10', при использовании передовых и текущих миграций Yii2. Не то, чтобы вы не могли его изменить :) На всякий случай кто-то спотыкается здесь, я хотел, чтобы эта разница была отмечена. –
Я могу предложить вариант метода из статьи, о которой вы упомянули. сделать первые 2 шага, как это было описано, и затем выполните следующие действия:
1. Добавить поле role
в модели пользователя и оценивать его с thevalue одной из констант из примера статьи (User :: ROLE_ADMIN или Пользователь :: ROLE_USER)
2. Override юй \ Web \ User-> может()
public function can($permissionName, $params = [], $allowCaching = true)
{
/** @var \app\models\User $user */
$user = $this->identity;
$access = false;
do {
if (\Yii::$app->user->isGuest) {
break;
}
if ($user->role === \common\models\User::ROLE_ADMIN) {
$access = true;
break;
}
if (is_array($permissionName)) {
$access = in_array($user->role, $permissionName);
} else {
$access = $permissionName === $user->role;
}
} while (false);
return $access;
}
Итак, теперь вы можете проверить роль пользователя, как это:
\Yii::$app->user->can(User::ROLE_USER)
3. Вы говорите:
я не знаю, как применить этот контроль доступа ко всему модулю.
Затем откройте класс модуля и добавьте следующие строки в поведения() метод:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => [User::ROLE_ADMIN]
]
]
]
];
}
В этом примере мы предоставить доступ к ROLE_ADMIN ко всем действиям всех контроллеров модуля. Вот и все.
В соответствии с «Yii2 Guide « ACF - это фильтр действий, который может использоваться в контроллере или модуле »таким же образом.
Просто добавьте ниже код в контроллер, который вы хотите, чтобы ограничить функциональность
'access' => [
'class' => AccessControl::className(),
'rules' =>
[
[
'actions' => ['index','view'],
'allow' => true,
'roles' => ['@']
],
[
'actions' => ['create','update','delete'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action)
{
return Admin::isUserAdmin(Yii::$app->user->identity->username);
}
],
],
],
- 1. yii2 Контроль доступа не работает
- 2. Контроль доступа YII2 с модулями
- 3. Установить права доступа для каждого модуля в Yii2
- 4. Контроль доступа в Qt
- 5. Контроль доступа в asp.NET
- 6. Контроль доступа в vb.net
- 7. Контроль доступа в Glassfish
- 8. Контроль доступа в LoopBack
- 9. yii2 аутентификация модуля separete
- 10. Конфигурация Yii2 для модуля
- 11. Yii2. Класс переопределения модуля
- 12. Независимость модуля Yii2
- 13. Установка модуля управления пользователями Yii2
- 14. C контроль доступа
- 15. Многопоточный контроль доступа UI
- 16. контроль доступа отключил меня
- 17. Prolog - Контроль доступа?
- 18. Контроль доступа Auth0
- 19. Контроль доступа JAX-RS
- 20. Контроль доступа определенных пользователей
- 21. Контроль доступа к классу
- 22. Контроль доступа Apache
- 23. Контроль доступа к DLL
- 24. PHP Гибкий контроль доступа
- 25. Контроль доступа для объектов
- 26. Linux Контроль доступа CVS
- 27. Контроль доступа лития
- 28. Контроль доступа MYSQL
- 29. Rails простой контроль доступа
- 30. Контроль доступа Cassandra
Так Yii2 Модуль не имеет метод поведения, не так ли? – user1571234
@ user1571234 он имеет, и если вы хотите иметь правила доступа для всего модуля, и ни один из его контроллеров не будет иметь разные правила доступа, вы можете определить их в методе 'behaviors' модуля. Определение правил доступа в родительском контроллере и их наследование дает вам большую гибкость, если вам нужно различное поведение для некоторых ваших контроллеров. – Tony
Большое спасибо – user1571234