Php Yii2需要所有控制器和操作才能登录
在我的sitecontroller中,我这样写Php Yii2需要所有控制器和操作才能登录,php,yii,yii2,Php,Yii,Yii2,在我的sitecontroller中,我这样写 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['login', 'error'], 'allow' => true, ], [
'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' => ['@'],
],
],
],
[
'allow' => true,
'roles' => ['@'],
],
所以,若我转到索引或回调操作,我将重定向到登录页面。
但我必须为每个控制器的所有操作执行此操作。
您能告诉我最好的方法吗?将此规则放在
规则
部分的开头:
[
'allow' => true,
'roles' => ['@'],
],
省略操作
表示所有操作
[
'allow' => true,
'roles' => ['@'],
],
因此,您的AccessControl
配置如下:
[
'allow' => true,
'roles' => ['@'],
],
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
// ...
],
],
];
}
请记住,规则是按声明顺序应用的
[
'allow' => true,
'roles' => ['@'],
],
要在不继承的情况下全局执行此操作,请在应用程序配置中的组件声明下方(不在内部!)添加请求前的数组:
[
'allow' => true,
'roles' => ['@'],
],
'components' => [ ... ],
'as beforeRequest' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'allow' => true,
'actions' => ['login'],
],
[
'allow' => true,
'roles' => ['@'],
],
],
'denyCallback' => function () {
return Yii::$app->response->redirect(['site/login']);
},
],
此代码将在每次请求之前运行,并阻止除来宾登录之外的所有操作
[
'allow' => true,
'roles' => ['@'],
],
确保除了SiteController
之外,其他控制器中没有login
操作。如果存在(例如,它们用于不同的目的),请在相应的控制器中显式阻止它们。但这是非常罕见的情况。如果您完全忽略数组中的“操作”
”-部分,它将对控制器的所有操作有效
[
'allow' => true,
'roles' => ['@'],
],
如果要对每个控制器执行此操作,只需在两者之间添加一层:
[
'allow' => true,
'roles' => ['@'],
],
class MyAccessController extends \yii\web\Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'allow' => true,
'roles' => ['@'],
],
],
];
}
}
然后从该类派生您的控制器。
或者,您可以将其放入一个trait
中,并在每个控制器中使用add it和use
。如果您想将访问控制添加到所有控制器操作中。请在“组件”部分的主配置文件中添加以下代码
[
'allow' => true,
'roles' => ['@'],
],
'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' => ['@'],
],
],
],
在下面的文件中尝试这个
[
'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' => ['@'],
],
],
],
@arogachev It给了我一个错误:必须设置User::identityClass:(@pooria在应用程序配置中的components/User
array部分下设置它,就像这样(高级应用程序的示例):'identityClass'=>'common\models\User',
@arogachev发生了另一个问题!我使用的是dektrium Yi2用户。这样,它显示的是Yi2的默认登录页面,而不是dektrium的。在这种情况下,@pooria只是重定向方法中的正确路径。@Choxx谢谢,最后我发现了问题,我错过了操作的真实名称,我知道了n url显示“user/forget”,但实际上是“user/recovery/request”,所以我只需查看yii的调试器:)这是不正确的。1) 此代码不需要添加到组件
部分,而是添加到$config
中(在上面的级别),否则它将无法工作。2) 此部分'actions'=>['logout','index']
将另外只允许身份验证用户执行注销
和索引
操作,您需要将其删除以允许访问整个站点。然后,您可以在AccessControl
或特定控制器的操作中进一步自定义访问权限。我也解释过了,谢谢阿罗加切夫。也许我的话让你感到困惑。我的意思是在“组件”部分下,指组件部分结束的地方。我并不想在components部分中添加这部分代码。