如何在 CakePHP 4 中检查(在模板中)是不是 $user->can('access', $request)?
Posted
技术标签:
【中文标题】如何在 CakePHP 4 中检查(在模板中)是不是 $user->can(\'access\', $request)?【英文标题】:How to check (in template) if $user->can('access', $request) in CakePHP 4?如何在 CakePHP 4 中检查(在模板中)是否 $user->can('access', $request)? 【发布时间】:2021-11-26 08:38:46 【问题描述】:我在 src/Policy/RequestPolicy.php 中创建了一个 RequestPolicy,只允许“超级管理员”用户访问我的 SuperRubriquesController 的所有操作:
namespace App\Policy;
use Authorization\Policy\RequestPolicyInterface;
use Cake\Http\ServerRequest;
use Authorization\IdentityInterface;
class RequestPolicy implements RequestPolicyInterface
/**
* Method to check if the request can be accessed
*
* @param \Authorization\IdentityInterface|null $identity Identity
* @param \Cake\Http\ServerRequest $request Server Request
* @return bool
*/
public function canAccess($identity, ServerRequest $request)
if ($request->getParam('controller') === 'SuperRubriques' && $identity)
return $identity->role === 'super-admin';
return true;
当我转到“/super-rubriques/index”或 SuperRubriquesController 的其他操作时,它工作正常,但我想知道是否有办法检查用户是否可以访问来自模板的请求。 例如,我想在显示链接之前检查用户是否可以访问 SuperRubriquesController 的操作索引。
if ($this->request->getAttribute('identity')->can('access', $requestToSuperRubriquesIndex))
echo $this->html->link('Super Rubriques', ['controller' => 'SuperRubriques', 'action' => 'index']);
如何构建$requestToSuperRubriquesIndex
?
【问题讨论】:
【参考方案1】:一种方法是使用当前请求对象的with*
方法来创建具有修改数据的克隆:
$requestToSuperRubriquesIndex = $this->request
->withParam('controller', 'SuperRubriques')
->withParam('action', 'index');
另见
API > \Cake\Http\ServerRequest::withParam()【讨论】:
谢谢,它似乎工作。关于“ps”,当用户未通过身份验证而不是将他重定向到登录页面时,检查控制器条件内部的$identity
会抛出一个禁止的异常。
@Oliv 所以我猜你正在使用请求授权中间件?
你的意思是认证中间件?我是。那么 Requestpolicy::canAccess() 代码对你来说似乎没问题(即安全)吗?
@Oliv 不,我的意思是RequestAuthorizationMiddleware
,这会在身份验证组件检查控制器之前检查授权,这通常会导致重定向。如果使用该中间件,检查就可以了,因为身份是 null
,并且稍后会进行身份验证检查。
是的,我在 Application::middleware() 中按顺序使用AuthenticationMiddleware
、AuthorizationMiddleware
和RequestAuthorizationMiddleware
。谢谢以上是关于如何在 CakePHP 4 中检查(在模板中)是不是 $user->can('access', $request)?的主要内容,如果未能解决你的问题,请参考以下文章