В моем 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' => ['@'], ], ], ],