Php 当请求为POST且用户未经身份验证时,Yii2中的自定义操作筛选器不起作用

Php 当请求为POST且用户未经身份验证时,Yii2中的自定义操作筛选器不起作用,php,filter,yii2,Php,Filter,Yii2,所以,我有我的Yii2小应用程序和测验。每个测验属于一个用户,用户有许多测验,标准的东西。我想做的是限制用户更新或删除不属于他们的测验。简单明了 现在,我意识到,这类事情有一个具体的解决方案,叫做,但我仍然不想处理角色和设置所有的事情 所以我决定创建一个小的自定义过滤器来实现这一点 namespace frontend\components; use ... class UserOwnerAccessControlFilter extends ActionFilter { public fu

所以,我有我的Yii2小应用程序和测验。每个
测验
属于一个
用户
用户
有许多
测验
,标准的东西。我想做的是限制用户更新或删除不属于他们的测验。简单明了

现在,我意识到,这类事情有一个具体的解决方案,叫做,但我仍然不想处理角色和设置所有的事情

所以我决定创建一个小的自定义过滤器来实现这一点

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,请求通过

  • 现在,我不熟悉PHP和Yii(是的,我已经讨厌它了),所以以防万一,这里是我的
    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
    ,并且所有规则都禁止任何其他地方处理请求。