在通过Spring MVC 4应用程序中的websocket连接发送的调用中,在将此作为参数添加到方法中时,我可以获得java.security.Principal
对象。
但是,这基本上只有用户名,我需要在登录时创建的(扩展)UserDetails
对象。
SecurityContextHolder.getContext().getAuthentication()
返回null
。据我所知,因为spring创建了一个特殊的会话来处理websocket连接。
问题:有没有办法从websocket会话/线程中访问securitycontext?
(能够访问会话bean也足够了。)
答案 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