2

你好!

我正在使用 grails jms 和气氛插件...

尝试将 springSecurityService 注入 Jms-Atmosphere Service 类时,principal/currentUser 为空,而有对该对象的引用(springSecurityService 不为空)

//Grails Service class
class UserMessageService {

        static transactional = true
        static exposes = ['jms']
        static destination = "queue.usermessage"

        def jmsService
        def springSecurityService

        public def onMessage(msg) {
           sleep(2000) // slow it down
           log.info "sending jms mssage"
           //User is null!!
           User user = springSecurityService.currentUser

           jmsService.send(topic:'msgevent', msg)

           return null
        }
}

所以我想知道......
这是插件问题,还是监听从 jms 插件发布的事件(作为事件监听器)的问题?当使用 Atmosphere 插件将 Atmosphere Hander 用作服务时,我遇到了同样的问题!在这种情况下,气氛服务也必须暴露于 jms 事件!请给我一些想法来解决这个问题......解决方法也许......谢谢

4

1 回答 1

0

我猜您的特定通话中没有设置 cookie。你在使用网络套接字吗?确保您拥有 Atmosphere 1.0.0 并启用了会话支持!然后,您仍然需要从原始请求中获取身份验证:

if(resource.writer instanceof WebsocketResponseWriter) {
    AtmosphereResource resource = resource.atmosphereResource
    SecurityContext sessionContext = resource.session
       .getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY)
}

然后,您需要为当前会话上下文提供来自您找到的会话上下文的身份验证。确保在处理请求后重置身份验证。

这有帮助吗?

于 2012-09-14T08:03:16.780 回答