【问题标题】:Spring Security "Token-based Authentication" for SockJS / STOMP Web SocketSockJS / STOMP Web Socket的Spring Security“基于令牌的身份验证”
【发布时间】:2017-09-14 12:16:56
【问题描述】:

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

我对我的 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;
        }
    });
  }
}

但是,我完全失去了在“主要用户 = ... ;”中的表现。我将如何使用令牌获得 Principle?有没有人能解释一下?

【问题讨论】:

标签: spring-security spring-websocket


【解决方案1】:

选项 A

如果您的 Websocket CONNECT 端点受 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);
}

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

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

【讨论】:

猜你喜欢
  • 2017-07-10
  • 2013-09-25
  • 2023-03-25
  • 2014-03-26
  • 2017-01-18
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多