Php 当请求为POST且用户未经身份验证时,Yii2中的自定义操作筛选器不起作用
所以,我有我的Yii2小应用程序和测验。每个Php 当请求为POST且用户未经身份验证时,Yii2中的自定义操作筛选器不起作用,php,filter,yii2,Php,Filter,Yii2,所以,我有我的Yii2小应用程序和测验。每个测验属于一个用户,用户有许多测验,标准的东西。我想做的是限制用户更新或删除不属于他们的测验。简单明了 现在,我意识到,这类事情有一个具体的解决方案,叫做,但我仍然不想处理角色和设置所有的事情 所以我决定创建一个小的自定义过滤器来实现这一点 namespace frontend\components; use ... class UserOwnerAccessControlFilter extends ActionFilter { public fu
测验
属于一个用户
,用户
有许多测验
,标准的东西。我想做的是限制用户更新或删除不属于他们的测验。简单明了
现在,我意识到,这类事情有一个具体的解决方案,叫做,但我仍然不想处理角色和设置所有的事情
所以我决定创建一个小的自定义过滤器来实现这一点
namespace frontend\components;
use ...
class UserOwnerAccessControlFilter extends ActionFilter
{
public function beforeAction($action)
{
if (Yii::$app->getUser()->isGuest) {
return Yii::$app->getResponse()->redirect(['site/login']);
}
$user = Yii::$app->getUser()->identity;
$controllerID = $action->controller->id;
if ($controllerID == 'quiz') {
$quiz = Quiz::findOne(['id'=> Yii::$app->getRequest()->queryParams['id']]);
if ($quiz->user_id != $user->id) {
throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
return false;
}
} elseif ($controllerID == 'chapter') {
//TODO
}
return parent::beforeAction($action);
}
public function afterAction($action, $result)
{
return parent::afterAction($action, $result);
}
}
当然,我还为quick
controller的行为插入了一些行:
public function behaviors()
{
return [
...
[
'class' => UserOwnerAccessControlFilter::className(),
'only' => ['update', 'delete'],
]
];
}
从上面可以看到,此筛选器仅适用于update
和delete
操作
现在,我已经非常非常彻底地测试了所有这些,我收到了结果:
a
创建测验
时,使用用户B
登录并尝试编辑或删除测验
,过滤器工作完全正常。我得到的禁止httpexception
正是我想得到的a
创建quick
时,注销,并尝试进入quick/update
页面(使用GET
http请求)进行quick
未经身份验证,我会被重定向到站点/登录
。正如我想的那样a
创建测验
,注销,并且未经身份验证时,我通过黑客攻击,并发出POST
请求执行update
或delete
操作,过滤器不起作用!!!1,请求通过urlManager
代码,可能与此有关:
...
'urlManager' => [
'enablePrettyUrl' => 'true',
'showScriptName' => 'false',
'enableStrictParsing' => 'true',
'scriptUrl' => '',
'rules' => [
'' => 'site/index',
'about' => 'site/about',
'contact' => 'site/contact',
'logout' => 'site/logout',
'signup' => 'site/signup',
'login' => 'site/login',
'request-password-reset' => 'site/request-password-reset',
'quizzes' => 'quiz/index',
'quizzes/create' => 'quiz/create',
'quiz/<id:\d+>' => 'quiz/view',
'quiz/<id:\d+>/edit' => 'quiz/update',
'quiz/<id:\d+>/delete' => 'quiz/delete',
]
],
...
。。。
“urlManager”=>[
'enablePrettyUrl'=>'true',
'showScriptName'=>'false',
'enableStrictParsing'=>'true',
“scriptUrl'=>”,
“规则”=>[
''=>'站点/索引',
“关于”=>“站点/关于”,
“联系人”=>“站点/联系人”,
“注销”=>“站点/注销”,
“注册”=>“站点/注册”,
'登录'=>'站点/登录',
“请求密码重置”=>“站点/请求密码重置”,
“测验”=>“测验/索引”,
“测验/创建”=>“测验/创建”,
“测验/”=>“测验/查看”,
'测验//编辑'=>'测验/更新',
'测验//删除'=>'测验/删除',
]
],
...
有人对此有什么想法吗?提前谢谢。奇怪的问题。。。可能尝试一个var_转储($user);就在获取身份之后?我试过了,问题是当请求是POST时,甚至没有执行过滤代码,它只是忽略了整个过滤过程。也就是说,不管我是否要让var_变湿,它都会忽略过滤器,就像它根本不存在一样。你用的是REST吗?我猜你的POST请求是通过另一个控制器处理的,而不是你的过滤器所在的控制器…这可能吗?假设
enableStrictParsing
为true
,并且所有规则都禁止任何其他地方处理请求。