4

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

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

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

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

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

4

3 回答 3

1

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

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

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

这适用于 Spring Boot 1.5.4

于 2017-09-15T23:41:25.093 回答
0

I suppose you have extended AbstractWebSocketHandler

the you could have principal name :

@Override
public void afterConnectionEstablished ( WebSocketSession session ) throws Exception {
    logger.info ( "afterConnectionEstablished = " + session.getPrincipal () );
}
于 2015-07-06T22:52:49.627 回答
-2

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

@AuthenticationPrincipal CustomUser customUser

到您的 @MessageMapping 方法。

你可以在这里找到更多:http: //docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#mvc-authentication-principal

于 2015-06-17T16:25:28.057 回答