php - 自动将 Voter 应用到 Controller 中的多种方法

标签 php symfony authorization symfony-3.3

我有一个投票者,检查用户是否可以编辑文档,规则是用户拥有文档或用户是 super 管理员,要检查文档的所有权,首先必须获取文档实体。我做到了这一点,没有任何问题。

但看来我必须补充一下: $this->denyAccessUnlessGranted('edit', $doc); 我的 Controller 中有大约 7 个方法,有没有更有效的方法来做到这一点?

我想过使用内核事件,但是将此检查放入事件订阅者中并没有多大作用,因为我没有看到任何方法可以影响进一步的代码执行。如果我抛出未捕获的异常,整个 Symfony 将崩溃。无论我做什么,被调用的方法都会被执行...但是我最好只编辑每个方法。 我不想到处重复这段代码,但似乎我没有其他选择。

最佳答案

这取决于您从哪里获得 $doc 。你可以输入@Security将注释(或 @IsGranted("do-stuff-with-doc") )添加到类本身上,以允许或拒绝访问其中的所有操作(这确实假设您想要保护的 7 个操作位于同一个类中)。

带有voter检查当前用户对名为“do-stuff-with-doc”的权限的访问权限,因为这也将是一项服务,它可以访问您想要注入(inject)的所有其他服务,并且$request 即将被注入(inject)到适当的操作中(通过 RequestStack $reqstack; $currRequest = $reqstack->getCurrentRequest(); )。当前请求中是操作的参数,该参数要么具有 $doc,要么具有您可能获得的足够信息。

从中,或者您可以自动连接(或手动定义注入(inject))到投票者的其他服务,这取决于您如何或为什么用户可以访问任何内容。

class DoDocStuffVoter extends Voter
{
    public function __construct(RequestStack $reqStack)
    {
        $this->reqStack = $reqStack;
        // and other services you want to add
    }

    public function supports($attribute, $subject)
    {
        return $attribute === 'do-stuff-with-doc';
    }

    protected function voteOnAttribute($attribute, $object, TokenInterface $token): bool
    {
        $user = $token->getUser(); 
        $request = $this->reqStack->getCurrentRequest();

        dump($user, $request);
        die;

        // does someone with this request get access to doc?
        return $this->userHasAccessToDoc($user, $request);  
    }
}

关于php - 自动将 Voter 应用到 Controller 中的多种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50952292/

相关文章:

javascript - 将数组中的值存储到jquery中的变量中

doctrine-orm - Symfony 3、Doctrine 2、自定义 fixture 加载器

angularjs - 如果用户未使用 UI-Router 和 AngularJS 登录,则转移到备用主页

javascript - Node.js + Socket.io 如何从 PHP 接收数据

php - 如何使用 PHP 接收通过 POST 请求提交的图像(文件)

PHP - session_id() 给我 HTTP/1.1 500 内部服务器错误

php - Sonata Admin与文件上传的一对多关系(appendFormFieldElement)

Symfony2 循环引用

Java swagger注解进行授权

security - 如何在 RESTful 应用程序中防止 CSRF?