我有一个投票者,检查用户是否可以编辑文档,规则是用户拥有文档或用户是 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/