如何在 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() 中按顺序使用AuthenticationMiddlewareAuthorizationMiddlewareRequestAuthorizationMiddleware。谢谢

以上是关于如何在 CakePHP 4 中检查(在模板中)是不是 $user->can('access', $request)?的主要内容,如果未能解决你的问题,请参考以下文章

检查在 CakePHP 中发送电子邮件是不是成功/失败?

Cakephp:在保存之前检查数据是不是存在

在加载页面 cakephp 时检查字段天气是不是过期

Symfony 2:如何检查用户是不是未在模板中登录?

在 CakePHP 中保存时如何验证关联模型是不是存在

如何使用 Velocity 模板语言检查数组中是不是存在值