在 Websocket 会话 Spring MVC 中访问用户详细信息对象



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

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

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

问题:有没有办法从 websocket 会话/线程内部访问安全上下文?

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

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

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

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

这对我适用于春季启动 1.5.4

我想你已经扩展了AbstractWebSocketHandler

你可以有主体名称:

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

我还没有测试过它,但你应该能够访问你的用户添加一个参数,比如

@AuthenticationPrincipal CustomUser customUser

到您的@MessageMapping方法。

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

最新更新