Yii2 требует, чтобы все контроллеры и действия вошли в систему
В моем sitecontroller я пишу вот так
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index' ,'call-back'], // add all actions to take guest to login page
'allow' => true,
'roles' => ['@'],
],
],
],
Поэтому, если я перейду к указательному или обратному действию, я перейду на страницу входа.
но я должен сделать это для всех действий для каждого контроллера.
Не могли бы вы сказать мне, как это сделать?
Ответы
Ответ 1
Поместите это правило в начало раздела rules
:
[
'allow' => true,
'roles' => ['@'],
],
Опускание actions
означает все действия.
Итак, ваш конфигуратор AccessControl
будет таким:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
// ...
],
],
];
}
Имейте в виду, что правила применяются для их объявления.
Чтобы сделать это глобально без наследования, добавьте массив as beforeRequest
ниже (не внутри!) объявления components
в конфигурацию вашего приложения:
'components' => [ ... ],
'as beforeRequest' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'allow' => true,
'actions' => ['login'],
],
[
'allow' => true,
'roles' => ['@'],
],
],
'denyCallback' => function () {
return Yii::$app->response->redirect(['site/login']);
},
],
Этот код будет запускаться перед каждым запросом и блокировать все действия, кроме login
для гостей.
Убедитесь, что в других контроллерах нет login
, чем SiteController
. Если есть (и, например, они предназначены для разных целей), заблокируйте их явно в соответствующих контроллерах. Но это довольно редкий случай.
Ответ 2
Если вы хотите добавить контроль доступа ко всем действиям вашего контроллера. Пожалуйста, добавьте ниже код в основной файл конфигурации в разделе компонентов.
'as access' => [
'class' => \yii\filters\AccessControl::className(),//AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index'], // add all actions to take guest to login page
'allow' => true,
'roles' => ['@'],
],
],
],
Ответ 3
Если вы полностью опустите часть "actions
" из массива, она будет действительна для всех действий контроллера.
Если вы хотите сделать это для каждого контроллера, просто добавьте слой между ними:
class MyAccessController extends \yii\web\Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
];
}
}
И затем выведите controller
из этого класса.
Или вы можете поместить его в trait
и использовать добавить его с помощью use
в каждом контроллере.
Ответ 4
Попробуйте это в следующем файле.
frontend/config/main.php
components =>[ your stuff ],
'as beforeRequest' =>
[
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
],