1

我有这个服务类:

class UserService {

    def springSecurityService

    @Listener(topic = 'currentUser', namespace = 'auth')
    public User getCurrentUser(){
        return springSecurityService.currentUser
    }

    def authenticate(OAuthToken oAuthToken){
        SecurityContextHolder.context.authentication = oAuthToken
        return springSecurityService.currentUser
    }
}

如果我使用身份验证方法,springSecurityService.currentUser则返回当前用户。但是,如果我已经登录,我想用getCurrentUser方法获取当前用户,它返回 null。我调试了Springsecurityservice.getCurrentUser方法,方法“isLoggedIn”返回false。

但是,如果我在我看来尝试这个,它会起作用:

<sec:ifLoggedIn>Yeeees</sec:ifLoggedIn>

更新:

当我UserService.getCurrentUser在 SecurityService 中运行 SCH.context.authentication 时返回 null。在该调用之后,将呈现视图并SCH.context.authentication返回正确的身份验证。

更新 2:

我分析了它,它似乎只有在我将它与事件总线一起使用时才会发生。如果我直接从控制器调用 getCurrentUser,它工作正常,但如果我使用事件总线,它不会。我使用来自平台核心插件的事件总线。Event Bus 是否还有另一个 SCH.context?

4

2 回答 2

4

我找到了解决方案。问题是事件总线在线程中工作,默认情况下弹簧上下文不会传递给线程。

配置中的选项“上下文持有者策略”解决了这个问题:

grails.plugin.springsecurity.sch.strategyName = org.springframework.security.core.context.SecurityContextHolder.MODE_INHERITABLETHREADLOCAL

http://grails-plugins.github.io/grails-spring-security-core/latest/#miscProperties

于 2015-04-09T14:08:13.370 回答
0

您可以获取主体然后搜索用户,在我的情况下,域是 AppUser

        def user = springSecurityService.getPrincipal()
        def testUser =AppUser.findByUsername(user.username)
于 2018-02-01T06:36:36.257 回答