我是使用Spring Security插件为我的grails应用程序做的新手。这是我获取当前用户登录的代码。
String username = getPrincipal().username
但问题是我在每一个动作中写这一行来获得当前用户。有没有办法全球获得当前用户?并且在没有一次又一次声明的情况下在每个动作中使用它?
答案 0 :(得分:3)
你可以用两种方式做到:
1)您可以在任何控制器/服务中注入SpringSecurityService:
SpringSecurityService springSecurityService
def someMethod(){
springSecurityService.principal
}
2)您可以使用SecurityContextHolder:
def someMethod(){
SecurityContextHolder.context.authentication?.principal
}
我建议使用选项1,它使测试更容易等。
答案 1 :(得分:0)
如果您需要获取用户对象,我建议您检索" fresh" (每次使用DB)用户实例使用springSecurityService
之前的注入:
springSecurityService.principal.username
但是如果你只需要一个用户名 - 你可以创建一个会话范围的bean,并在创建时用username填充它:
<强> 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。