Php Yii2需要所有控制器和操作才能登录

Php Yii2需要所有控制器和操作才能登录,php,yii,yii2,Php,Yii,Yii2,在我的sitecontroller中,我这样写 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['login', 'error'], 'allow' => true, ], [

在我的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' => ['@'],
            ],
        ],
    ],
[
    '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部分中添加这部分代码。