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 springSecurityService如何设置当前用户