grails - 全局获取当前用户

Posted

技术标签:

【中文标题】grails - 全局获取当前用户【英文标题】:grails - get current user globally 【发布时间】:2017-10-05 21:41:27 【问题描述】:

我刚开始为我的 grails 应用程序使用 Spring Security 插件。这是我让当前用户登录的代码。

String username = getPrincipal().username

但问题是我在每个操作中都写了这一行来获取当前用户。有没有办法全局获取当前用户?并且在每一个动作中都使用它而不一遍又一遍地声明它?

【问题讨论】:

创建一个名为 BaseController 的类,并让每个控制器扩展它,然后在其中创建一个受保护的方法,可供所有人访问。 【参考方案1】:

如果您需要获取用户对象,我建议您每次使用springSecurityService 之前注入的“新鲜”(从数据库中获取)用户实例:

springSecurityService.principal.username

但如果您只需要一个用户名 - 您可以创建一个会话范围的 bean 并在创建时使用用户名填充它:

resources.groovy

...
userNameHolder(UserNameHolder)  bean ->
    bean.scope = 'session'
    springSecurityService = ref("springSecurityService")

...

还有:

class UserNameHolder 
    def springSecurityService

    String username = springSecurityService.principal.username

    String getUsername() 
        username
    

然后你应该将UserNameHolder注入到需要的地方并检索用户名:

class SomeService 

    def userNameHolder

    void someMethod() 
        ...
        userNameHolder.username
        ...
    
    ...

享受吧!

UPD

您可以通过将用户名放入 HTTPSession 中进行几乎相同的操作,但它的可控制性和可测试性要少得多。所以我强烈建议您使用会话范围的 bean。

【讨论】:

springSecurityService.currentUser?.userName 除非 userName 属性在主体上不可用,否则会执行不必​​要的数据库调用。 springSecurityService.principal.username 会更好。【参考方案2】:

您可以通过两种方式做到这一点: 1)您可以在任何地方注入 SpringSecurityService,只需在任何控制器/服务中:

SpringSecurityService springSecurityService

def someMethod()
   springSecurityService.principal

2) 你可以使用 SecurityContextHolder:

def someMethod()
   SecurityContextHolder.context.authentication?.principal

我建议使用选项 1,它使测试更容易等等。

【讨论】:

以上是关于grails - 全局获取当前用户的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.1.0 / Java 7 从哪里获取 Windows 8.1 上的当前用户名?

如何使用spring security在grails中获取所有当前登录用户的列表(包括rememberme cookie)

在 Grails 中获取当前页面的 URL

Grails springSecurityService如何设置当前用户

如何获取 Grails/Tomcat Webapp 的当前工作目录?

如何在Grails 2单元测试中获取spring security提供的currentUser