访问Websocket会话Spring MVC中的UserDetails对象

时间:2014-09-17 11:58:37

标签: spring-mvc spring-security websocket spring-websocket

在通过Spring MVC 4应用程序中的websocket连接发送的调用中,在将此作为参数添加到方法中时,我可以获得java.security.Principal对象。

但是,这基本上只有用户名,我需要在登录时创建的(扩展)UserDetails对象。

SecurityContextHolder.getContext().getAuthentication()返回null。据我所知,因为spring创建了一个特殊的会话来处理websocket连接。

问题:有没有办法从websocket会话/线程中访问securitycontext?

(能够访问会话bean也足够了。)

3 个答案:

答案 0 :(得分:1)

@AuthenticationPrincipal专门用于REST / MVC方法。

但是,您可以通过向java.security.Principle带注释的方法添加类型为@MessageMapping的参数,然后从中获取真实的UserDetails对象,如下所示:

FooUserDetails currentUser = (FooUserDetails) ((Authentication) user).getPrincipal();

这适用于我的Spring Boot 1.5.4

答案 1 :(得分:0)

我想你已经扩展了 AbstractWebSocketHandler

您可以拥有主要名称:

@Override
public void afterConnectionEstablished ( WebSocketSession session ) throws Exception {
    logger.info ( "afterConnectionEstablished = " + session.getPrincipal () );
}

答案 2 :(得分:-1)

我没有对其进行测试,但您应该可以访问添加

等参数的用户
@AuthenticationPrincipal CustomUser customUser

到@MessageMapping方法。

您可以在此处找到更多信息:http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#mvc-authentication-principal