Grails springSecurityService.currentUser返回null

时间:2015-04-09 11:15:10

标签: grails spring-security grails-platform-core

我有这个服务类:

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
    }
}

如果我使用authenticate方法,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,它工作正常,但如果我使用事件总线它不会。 我使用来自platform-core插件的Event Bus。事件总线还有另一个SCH.context吗?

2 个答案:

答案 0 :(得分:4)

我找到了解决方案。问题是Event Bus在一个线程内工作,默认情况下spring弹簧上下文不会传递给线程。

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

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

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

答案 1 :(得分:0)

您可以获取主体,然后搜索用户,在我的案例中,域名是AppUser

        def user = springSecurityService.getPrincipal()
        def testUser =AppUser.findByUsername(user.username)