我已经在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());
1条答案
按热度按时间kxkpmulp1#
不 , 策略 不能 这样 做 , 这 不是 它 所 关心 的 , 它 应该 做 的 只是 回答 是否 允许 给定 的 身份 访问 给定 的 资源 。
如果 你 想要 自 定义 重 定向 , 那么 你 应该 考虑 实现 一 个 自 定义 的 " 未 授权 处理 程序 " , 在 那里 你 可以 检查 身份 并 计算 重 定向 URL 。 例如 , 扩展 内置 的 重 定向 处理 程序 , 并 覆盖 它 的 URL 生成 方法 , 大致 如下 :
第 一 个
另 请 参阅