Grails 如何使用spring安全插件获取当前用户角色?

Grails 如何使用spring安全插件获取当前用户角色?,grails,spring-security,authorization,role,Grails,Spring Security,Authorization,Role,我正在grails应用程序中使用spring安全核心插件。我需要知道当前用户在控制器操作中的角色。我如何检索它?您可以将springSecurityService注入控制器: def springSecurityService 然后在行动中,呼吁: def roles=springSecurityService.getPrincipal().getAuthorities() 查看文档。从控制器可以使用插件添加到元类的两种方法,getPrincipal和isLoggedIn: def myActi

我正在grails应用程序中使用spring安全核心插件。我需要知道当前用户在控制器操作中的角色。我如何检索它?

您可以将
springSecurityService
注入控制器:

def springSecurityService

然后在行动中,呼吁:

def roles=springSecurityService.getPrincipal().getAuthorities()


查看文档。

从控制器可以使用插件添加到元类的两种方法,
getPrincipal
isLoggedIn

def myAction = {
   if (loggedIn) {
      // will be a List of String
      def roleNames = principal.authorities*.authority
   }
}

如果操作是安全的,则可以跳过
loggedIn
/
isLoggedIn()
检查。

如果只需要检查用户是否处于特定角色,则使用
SpringSecurityUtils.ifallgrated
,它将单个字符串作为包含逗号分隔的角色列表的参数。如果当前用户属于所有用户,则返回true
SpringSecurityUtils
还具有类似于
IFAnyGrated
IFNotGrated
等方法,因此它应该适用于您试图实现的任何功能。

您还可以单独使用
getAuthenticatedUser()
。此方法自动注入每个控制器中,因此只能从控制器中使用。如果您想从其他任何地方访问当前登录的用户,则必须使用其他方法之一。

获取该用户

    def springSecurityService
    def principal = springSecurityService.principal
    String username = principal.username

SecurityContextHolder知道:

SecurityContextHolder.getContext().getAuthentication().getAuthorities()

酷,我没有意识到这些被添加到元类中。在控制器中使用,比如说,
authenticatedUser
比注入
springSecurityService
插件有什么缺点吗?看看插件代码,它们看起来基本相同。没有区别,只是更方便。用户特定变量(如roleNames)可以存储为控制器字段吗?我认为在控制器中存储任何状态都不安全,因为它将被共享。我说得对吗?如果是这样,是否有任何技巧可以避免在控制器的所有操作中重复此代码?如果使用以下代码,如何检查role的值是“role\u USER”还是“role\u ADMIN”?(def role in roles){If(role.getAuthority()=“role\u ADMIN”)//do something}