在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