Intereting Posts

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' => ['@'], ], ], ], 

поэтому, если я перейду к указателю или обратному вызову, я перейду на страницу входа. но я должен сделать это для всех действий для каждого контроллера. Не могли бы вы сказать мне, как это сделать?

Поместите это правило в начало раздела rules :

 [ 'allow' => true, 'roles' => ['@'], ], 

Опускание actions означает все действия.

Таким образом, ваша конфигурация AccessControl будет выглядеть так:

 public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'allow' => true, 'roles' => ['@'], ], // ... ], ], ]; } 

Имейте в виду, что правила применяются для их объявления.

Чтобы сделать это глобально без наследования, добавьте массив as beforeRequest ниже (не внутри!) Декларации components в вашем приложении config:

 '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 . Если есть (и, например, они предназначены для разных целей), заблокируйте их явно в соответствующих контроллерах. Но это довольно редкий случай.

Если вы хотите добавить контроль доступа ко всем действиям вашего контроллера. Пожалуйста, добавьте ниже код в основной файл конфигурации в разделе компонентов.

 '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' => ['@'], ], ], ], 

Если вы полностью опустите « 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 в каждом контроллере.

Попробуйте это в следующем файле.

 frontend/config/main.php components =>[ your stuff ], 'as beforeRequest' => [ 'class' => 'yii\filters\AccessControl', 'rules' => [ [ 'actions' => ['login', 'error'], 'allow' => true, ], [ 'allow' => true, 'roles' => ['@'], ], ], ],