Symfony如何使用注释@Security



我找不到任何关于如何使用symfony的@Security注释的明确帖子。我可以使用哪些参数?最重要的是,如何确保控制器不受来宾访问,仅供用户访问?

目前我有

/**
* 
* @Route("/reseller/create/", name="app_reseller_create", methods={"POST", "GET"})
* @IsGranted("ROLE_ADMIN")
*/
public function create(Request $request): Response
{
}

@ isgrant

如果您只想检查用户是否登录,您可以使用特殊属性而不是角色。对于完整的控制器,你必须在类定义上设置它。

/**
* @IsGranted("IS_AUTHENTICATED_FULLY")
*/
class MyClass {

有一些特殊的属性可以在任何你可以使用ROLE_的地方使用。

  • IS_AUTHENTICATED_FULLY已登录。
  • IS_AUTHENTICATED_REMEMBERED已登录或已记住cookie
  • IS_AUTHENTICATED_ANONYMOUSLY任何用户都有这个
  • IS_ANONYMOUS仅限来宾
  • IS_REMEMBERED仅限具有记忆cookie的用户
  • IS_IMPERSONATOR只允许在会话中冒充其他用户的用户。

在Symfony 5.1中引入了IS_ANONYMOUS,IS_REMEMBEREDIS_IMPERSONATOR属性。

@Security

安全注释比isgranting注释更灵活,可以使用表达式。

假设你想要一个页面,只有当用户是管理员并且在他的请求中有一个特定的令牌时才能访问。

  • with@IsGranted
/**
* @IsGranted("ROLE_ADMIN", statusCode=404)
*/
public function show(Request $request, Post $post) 
{
if (!$request->request->has('privatetoken') || 'mytoken' !== $request->request->get('privatetoken')) {
return $this->createNotFoundException('not found');
}
// Show Post
}
  • with@Security
/**
* @Security("is_granted('ROLE_ADMIN') and request.get('privatetoken') == 'mytoken'", statusCode=404)
*/
public function show(Post $post)
{
// Show Post
}

有了这个,你必须有一个管理员角色,在你的url中有一个privatetoken参数,就像mydomain.com/post/show/?privatetoken=mytoken一样,你不需要请求实例。

表达式可以访问以下变量:

  • token:当前安全令牌;
  • user:当前用户对象;request:请求实例;
  • roles:用户角色;
  • 和所有请求属性

有太多的可能性来发布这一切。但我认为它显示了@ isgrant的区别。

Symfony文档

最新更新