Yii2:不要重定向到登录控制器中的某个操作

Yii2: do not redirect to login for a certain action in controller

我有一个自定义控制器,我正在尝试在控制器中定义一个可以被来宾用户访问的操作。 我的控制器代码如下:

class MyCustomController extends Controller
{
    ...
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
            'access' => [
                'class' => AccessControl::class,
                'only' => ['live'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['live'],
                        'roles' => ['?'],
                    ],
                ]
            ]
        ];
    }


    /**
     * Live action.
     * @return mixed
     */
    public function actionLive()
    {
        return $this->render('live');
    }
...
}

查看代码是这样的:

<?php

echo 'We are live!!';

?>

我在frontend/config/main.php

中也有这个设置
return [
...
'as beforeRequest' => [
        'class' => 'yii\filters\AccessControl',
        'rules' => [
            [
                'actions' => ['login', 'error'],
                'allow' => true,
            ],
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
...
]

当我尝试以经过身份验证的用户身份访问页面 http://my-webapp/my-custom/live 时,我收到消息 Forbidden (#403) 没问题(尽管向经过身份验证的用户显示它也完全没问题)。

但是当我以访客用户身份访问该页面时,我被重定向到登录页面。我只想禁用此特定操作的重定向,让来宾用户看到该视图。

您正在应用 AccessControl 过滤器两次。

第一个过滤器是为 Application 设置的,因此它适用于具有以下规则的每个请求:

  1. 如果操作 ID 是“登录”或“错误”,则允许任何用户。
  2. 允许登录用户
  3. 拒绝任何其他请求。

第二个过滤器适用于 MyCustomController,它设置为仅适用于具有以下规则的控制器的操作 live 请求:

  1. 允许任何未登录的用户。
  2. 拒绝任何其他请求。

所以当请求来自登录用户时,请求被第二个过滤器阻止并显示 403 错误。 当请求来自访客用户时,它会被第一个过滤器阻止,用户被重定向到登录页面。

要允许访客访问您的操作,您应该向第一个过滤器添加例外以确保仅应用第二个 AccessControl 过滤器:

return [
    //...
    'as beforeRequest' => [
        'class' => 'yii\filters\AccessControl',
        'except' => ['my-custom/live'],
        'rules' => [
            [
                'actions' => ['login', 'error'],
                'allow' => true,
            ],
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
...
];

实际上,如果您同意允许任何用户查看 my-custom/live,则不需要第二个 AccessControl 过滤器。只需在第一个(应用程序范围)过滤器中设置异常就足够了。