Spring security “春季安全”;“基于令牌的身份验证”;对于SockJS/STOMP Web套接字

Spring security “春季安全”;“基于令牌的身份验证”;对于SockJS/STOMP Web套接字,spring-security,spring-websocket,Spring Security,Spring Websocket,我正在尝试实现基于令牌的身份验证 我对HTTP请求使用基本身份验证,所以Spring在成功身份验证后返回一个x-Auth-token。我正在将此令牌添加到STOMP CONNECT命令 @Configuration @EnableWebSocketMessageBroker public class MyConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureCli

我正在尝试实现基于令牌的身份验证

我对HTTP请求使用基本身份验证,所以Spring在成功身份验证后返回一个x-Auth-token。我正在将此令牌添加到STOMP CONNECT命令

@Configuration
@EnableWebSocketMessageBroker
public class MyConfig extends AbstractWebSocketMessageBrokerConfigurer {

  @Override
  public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.setInterceptors(new ChannelInterceptorAdapter() {

        @Override
        public Message<?> preSend(Message<?> message, MessageChannel channel) {

            StompHeaderAccessor accessor =
                MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

            if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                String authToken = accessor.getFirstNativeHeader("X-Auth-Token");
                log.debug("webSocket token is {}", authToken);
                Principal user = ... ; // access authentication header(s)
                accessor.setUser(user);
            }

            return message;
        }
    });
  }
}
@配置
@EnableWebSocketMessageBroker
公共类MyConfig扩展了AbstractWebSocketMessageBrokerConfiger{
@凌驾
公共无效配置ClientInBoundChannel(通道注册){
registration.setInterceptors(新的ChannelInterceptorAdapter(){
@凌驾
公共消息呈现(消息消息、消息通道){
StompHeaderAccessor存取器=
MessageHeaderAccessor.getAccessor(message,StompHeaderAccessor.class);
if(StompCommand.CONNECT.equals(accessor.getCommand())){
字符串authToken=accessor.getFirstNativeHeader(“X-Auth-Token”);
debug(“webSocket令牌为{}”,authToken);
主体用户=…;//访问身份验证头
accessor.setUser(用户);
}
返回消息;
}
});
}
}

然而,我完全不知道在“Principal user=…;”中该怎么做。我如何使用令牌获取原则?有人能解释一下吗?

选项A

如果您的Websocket连接端点是Spring安全的,那么您应该能够通过调用
Authentication auth=SecurityContextHolder.getContext().getAuthentication()获取主体(也称为用户)。从那里,您可以调用
auth.getPrincipal()

选项B

我个人使用JWT作为基于令牌的身份验证系统。我有一个自定义JWTService,其中我有一个从令牌获取用户的方法

public Authentication getAuthenticationFromToken(String token) {
    if (token != null) {
        UserDetails user = getUserFromToken(token);

        if (user != null)
            return new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
    }

    return null;
}

public UserDetails getUserFromToken(String token) {
    Jws<Claims> jws = Jwts.parser()
            .requireIssuer("myIssuer")
            .setSigningKey("myBase64Secret==")
            .parseClaimsJws(token);

    String username = jws.getBody().getSubject();
    return userDetailsService.loadUserByUsername(username);
}
公共身份验证getAuthenticationFromToken(字符串令牌){
if(令牌!=null){
UserDetails user=getUserFromToken(令牌);
如果(用户!=null)
返回新的UsernamePasswordAuthenticationToken(user,user.getPassword(),user.getAuthories());
}
返回null;
}
公共用户详细信息getUserFromToken(字符串标记){
Jws-Jws=Jwts.parser()
.发行人(“我的发行人”)
.setSigningKey(“myBase64Secret==”)
.parseClaimsJws(令牌);
字符串username=jws.getBody().getSubject();
返回userDetailsService.loadUserByUsername(用户名);
}
我用于JWT的库是


本教程还可以帮助您设置JWT

可能重复的我要实现机器到后端web套接字的身份验证和授权,没有用户原则,那么我如何继续?另外,请查看以下内容: