私のサイトコントローラーでは、このように書きます
'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
宣言:
'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' => ['@'],
],
],
],