我找不到任何关于如何使用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
已登录或已记住cookieIS_AUTHENTICATED_ANONYMOUSLY
任何用户都有这个IS_ANONYMOUS
仅限来宾IS_REMEMBERED
仅限具有记忆cookie的用户IS_IMPERSONATOR
只允许在会话中冒充其他用户的用户。
在Symfony 5.1中引入了IS_ANONYMOUS
,IS_REMEMBERED
和IS_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文档