如何将带字符串的IsGranted注释用作主题?

时间:2018-01-15 15:50:29

标签: symfony annotations

我发现在Symfony中我可以使用注释以干净的方式为我的控制器方法添加额外的功能。像这样举例如:

/**
 * @Route("/{id}")
 * @IsGranted("view", subject="product")
 * @return Response
 */
public function view(Product $product)
{
    dump(compact('product'));

    return new Response('It worked!');
}

但是,对于创建方法,我没有产品实例,所以我想使用@IsGranted注释作为主题字符串" App \ Entity \后&#34 ;.我希望我能这样做:

/**
 * @Route("/")
 * @IsGranted("create", subject=Product::class)
 * @return Response
 */
public function create()
{
    return new Response('Did it work?');
}

但遗憾的是我收到以下错误:Could not find the subject "App\Entity\Product" for the @IsGranted annotation. Try adding a "$App\Entity\Product" argument to your controller method.

所以@IsGranted仍然认为它应该寻找名为$App\Entity\Product的方法参数。有没有办法只用字符串文字就可以使用它?

3 个答案:

答案 0 :(得分:1)

你不能省略主题属性吗?

我还没有使用过注释,但我知道Symfony auth checker允许调用" isGranted"没有主题。

请参阅此处的示例:https://symfony.com/doc/current/security.html#securing-controllers-and-other-code

答案 1 :(得分:1)

另一种方式:

class AnotherController extends AbstractDashboardController
{
    public function index(): Response
    {
        $this->denyAccessUnlessGranted('MY_VOTER', 'my_variable');

        //...

    }
}

与 'IsGranted' 注释不同,方法 'denyAccessUnlessGranted' 使用字符串更容易 ;)

答案 2 :(得分:0)

这是旧帖子,但这是您可以完成的方式:

/**
 * @Route("/", defaults={"my_string": "my_content"})
 * @IsGranted("MY_VOTER", subject="my_string")
 */