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

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

String username = getPrincipal().username

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

【问题讨论】:

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

标签: spring grails groovy spring-security


【解决方案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,它使测试更容易等等。

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2011-11-22
    • 1970-01-01
    • 2018-09-26
    • 2012-05-04
    • 2014-03-17
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多