Yii2 要求所有 Controller 和 Action 登录
Yii2 require all Controller and Action to login
在我的站点控制器中我这样写
'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' => ['@'],
],
// ...
],
],
];
}
请记住,规则是按声明的顺序应用的。
要在没有继承的情况下全局执行,请在应用程序配置中的 components
声明下方(不是内部!)添加 as beforeRequest
数组:
'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
之外的所有访客操作。
确保除SiteController
以外的其他控制器没有login
动作。如果有(例如它们用于不同的目的),请在相应的控制器中明确阻止它们。但这种情况非常罕见。
如果你完全省略数组中的“actions
”部分,它将对控制器的所有动作有效。
如果你想为每个控制器都这样做,只需在两者之间添加一个层:
class MyAccessController extends \yii\web\Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
];
}
}
然后从 class 中导出 controller
。
或者您可以将它放在 trait
中,然后在每个控制器中使用 use
添加它。
如果您想为所有控制器操作添加访问控制。请在组件部分下的主配置文件中添加以下代码。
'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' => ['@'],
],
],
],
在以下文件中试试这个。
frontend/config/main.php
components =>[ your stuff ],
'as beforeRequest' =>
[
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
],
在我的站点控制器中我这样写
'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' => ['@'],
],
// ...
],
],
];
}
请记住,规则是按声明的顺序应用的。
要在没有继承的情况下全局执行,请在应用程序配置中的 components
声明下方(不是内部!)添加 as beforeRequest
数组:
'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
之外的所有访客操作。
确保除SiteController
以外的其他控制器没有login
动作。如果有(例如它们用于不同的目的),请在相应的控制器中明确阻止它们。但这种情况非常罕见。
如果你完全省略数组中的“actions
”部分,它将对控制器的所有动作有效。
如果你想为每个控制器都这样做,只需在两者之间添加一个层:
class MyAccessController extends \yii\web\Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
];
}
}
然后从 class 中导出 controller
。
或者您可以将它放在 trait
中,然后在每个控制器中使用 use
添加它。
如果您想为所有控制器操作添加访问控制。请在组件部分下的主配置文件中添加以下代码。
'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' => ['@'],
],
],
],
在以下文件中试试这个。
frontend/config/main.php
components =>[ your stuff ],
'as beforeRequest' =>
[
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
],