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
设置的,因此它适用于具有以下规则的每个请求:
- 如果操作 ID 是“登录”或“错误”,则允许任何用户。
- 允许登录用户
- 拒绝任何其他请求。
第二个过滤器适用于 MyCustomController
,它设置为仅适用于具有以下规则的控制器的操作 live
请求:
- 允许任何未登录的用户。
- 拒绝任何其他请求。
所以当请求来自登录用户时,请求被第二个过滤器阻止并显示 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
过滤器。只需在第一个(应用程序范围)过滤器中设置异常就足够了。
我有一个自定义控制器,我正在尝试在控制器中定义一个可以被来宾用户访问的操作。 我的控制器代码如下:
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
设置的,因此它适用于具有以下规则的每个请求:
- 如果操作 ID 是“登录”或“错误”,则允许任何用户。
- 允许登录用户
- 拒绝任何其他请求。
第二个过滤器适用于 MyCustomController
,它设置为仅适用于具有以下规则的控制器的操作 live
请求:
- 允许任何未登录的用户。
- 拒绝任何其他请求。
所以当请求来自登录用户时,请求被第二个过滤器阻止并显示 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
过滤器。只需在第一个(应用程序范围)过滤器中设置异常就足够了。