grails - 全球获取当前用户

时间:2017-05-08 00:57:10

标签: spring grails groovy spring-security

我是使用Spring Security插件为我的grails应用程序做的新手。这是我获取当前用户登录的代码。

String username = getPrincipal().username

但问题是我在每一个动作中写这一行来获得当前用户。有没有办法全球获得当前用户?并且在没有一次又一次声明的情况下在每个动作中使用它?

2 个答案:

答案 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。