我正在尝试根据 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/