CakePHP 4 RequestAuthorizationMiddleware -如何动态重定向未授权用户

xzabzqsa  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(146)

我已经在CakePHP 4.0中实现了新的身份验证、授权和请求授权中间件。(从认证的用户)到各种页面。当前,所有未授权的请求都被重定向到我的未授权重定向URL - Pages/Permission页面。是否有方法从RequestPolicy/canAccess函数动态更改未授权的重定向URL?
我的RequestPolicy/canAccess函数看起来像这样(已编辑):

public function canAccess($identity, ServerRequest $request)
{
    $unauthenticatedActions = $request->getAttribute('authentication')->getConfig('unauthenticatedActions');
    if (in_array($request->getParam('action'), $unauthenticatedActions, true)) { 
        return true;
    }
    else if(!empty($identity)){
        //check based on actions and user roles

        $userRole = $identity->role;
        $userStatus = $identity->status;
        $accountType = $identity->accountsubType;
        $action = $request->getParam('action');
        $controller = $request->getParam('controller');

        switch ($controller) {

            case 'Pages':
                return true;
                break;

            case 'Users':
                    if($userRole === 'ADMIN' && $userStatus === 'ACTIVE'){
                        return true;
                    }elseif($action === 'aaa'){
                        if($userRole === 'xxx' && $userStatus === 'ACTIVE'){
                            return true;
                        }
                        elseif($userRole === 'xxx' && $userStatus === 'EXPIRED'){
                            //redirect to custom 'suspended access' page
                            return false;
                        }
                        elseif($userRole === 'yyy' && $accountType === 'c'){
                            //redirect to custom 'restricted access' page 
                            return false;
                        }
                        else{
                            return false;
                        }
                    }
                    ...
                    return false;
            case: "Sales":   
            ...
            default:
                //none of the Controller names matches
                return false; //redirects to the default unauthorized redirect url (pages/permission)
                //here if I return true, I get the MissingControllerException, MissingActionException etc as expected
    }else{
        //force them back to the login page
        $request =  $request
                    ->withParam('controller', 'users')
                    ->withParam('action', 'login');
        return true; 
    }
}

src/应用程序/中间件()

$middlewareQueue
            ....
            ->add(new AuthenticationMiddleware($this))
            ->add(new AuthorizationMiddleware($this, [
                    'requireAuthorizationCheck' => true,
                    'unauthorizedHandler' => [
                        'className' => 'CustomRedirect',
                        'url' => '/pages/permission',
                        'exceptions' => [
                            'MissingIdentityException' => 'Authorization\Exception\MissingIdentityException',
                            'ForbiddenException' => 'Authorization\Exception\ForbiddenException'
                        ],
                    ],
                ]))
            ->add(new RequestAuthorizationMiddleware());
kxkpmulp

kxkpmulp1#

不 , 策略 不能 这样 做 , 这 不是 它 所 关心 的 , 它 应该 做 的 只是 回答 是否 允许 给定 的 身份 访问 给定 的 资源 。
如果 你 想要 自 定义 重 定向 , 那么 你 应该 考虑 实现 一 个 自 定义 的 " 未 授权 处理 程序 " , 在 那里 你 可以 检查 身份 并 计算 重 定向 URL 。 例如 , 扩展 内置 的 重 定向 处理 程序 , 并 覆盖 它 的 URL 生成 方法 , 大致 如下 :
第 一 个
另 请 参阅

      • 授权 手册 〉 授权 中间 件 〉 处理 未经 授权 的 请求 * *
      • 授权 操作 手册 〉 授权 中间 件 〉 如何 创建 自 定义 UnauthorizedHandler * *

相关问题