spring-security - SockJS/STOMP Web Socket 的 Spring Security "Token-based Authentication"

标签 spring-security spring-websocket

我正在尝试根据 https://github.com/spring-projects/spring-framework/blob/master/src/docs/asciidoc/web/web-websocket.adoc#token-based-authentication 实现基于 token 的身份验证.

我对 HTTP 请求使用基本身份验证,因此 Spring 在成功身份验证后返回 x-auth-token。我正在将此 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;
        }
    });
  }
}

但是,我完全迷失了在“主要用户 = ... ;”时该怎么做。我如何使用代币获得原理?有人能解释一下吗?

最佳答案

选项A

如果您的 Websocket CONNECT 端点受 Spring 保护,您应该能够通过调用 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 获取主体(也称为用户)。 。从那里,您可以调用 auth.getPrincipal()

选项B

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

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);
}

我用于 JWT 的库是 https://github.com/jwtk/jjwt

本教程还可以帮助您设置 JWT https://www.toptal.com/java/rest-security-with-jwt-spring-security-and-java

关于spring-security - SockJS/STOMP Web Socket 的 Spring Security "Token-based Authentication",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43475884/

相关文章:

spring-security - 通过路由配置 Spring Security headers()

spring-boot - 使用 Spring Websocket 向特定用户发送消息

ajax - 如何处理多台服务器上的WebSocket?

spring boot oauth2 配置 : resource server remains unprotected

java - Spring Security OpenID - UserDetailsS​​ervice,AuthenticationUserDetailsS​​ervice

java - 在 Spring 中如何从 "<sec:authentication property="principal.username"/>"打印用户的名字和姓氏

java - Spring 安全|授予匿名用户访问权限的问题

java - 在运行时从后端 java 类连接到 Web-Socket-Server

Spring websockets + Amazon MQ 限制

java - Spring 4 Websocket - 没有任何反应