CakePHP 4 模板中如何检测$user->can('access', $request)权限
解决方案
你可以直接手动实例化Cake\Http\ServerRequest对象,传入你要校验的路由参数即可,你的RequestPolicy仅校验controller参数,所以只需保证控制器参数匹配就能得到正确的权限校验结果,示例代码如下:
// 构造指向SuperRubriquesController index操作的请求对象 $requestToSuperRubriquesIndex = new \Cake\Http\ServerRequest([ 'params' => [ 'controller' => 'SuperRubriques', 'action' => 'index' ] ]); // 权限判断 加?->空安全运算符避免未登录场景报错 if ($this->request->getAttribute('identity')?->can('access', $requestToSuperRubriquesIndex)) { echo $this->Html->link('Super Rubriques', ['controller' => 'SuperRubriques', 'action' => 'index']); }
补充说明
如果你后续修改了RequestPolicy的校验逻辑,比如增加了前缀、插件、请求方法等判断条件,只需在构造ServerRequest的参数时补充对应配置即可,例如需要校验Admin前缀时:
$requestToSuperRubriquesIndex = new \Cake\Http\ServerRequest([ 'params' => [ 'prefix' => 'Admin', 'controller' => 'SuperRubriques', 'action' => 'index' ], 'environment' => [ 'REQUEST_METHOD' => 'GET' ] ]);
如果你的权限逻辑后续不会频繁变更,也可以直接简化判断,避免重复构造请求对象:
// 等价于你当前RequestPolicy的判断逻辑 if ($this->request->getAttribute('identity')?->role === 'super-admin') { echo $this->Html->link('Super Rubriques', ['controller' => 'SuperRubriques', 'action' => 'index']); }
内容的提问来源于stack exchange,提问作者Oliv
相关产品推荐
相关产品推荐

