尝试建立 WebSocket 连接时 JWT 身份验证阻止 SockJS 握手
JWT authentication blocking SockJS handshake when trying to make WebSocket connection
我有一个可用的 Spring 引导服务器 Authentication/Authorization。当尝试打开与 SockJS 的连接时,它被我的其他安全措施阻止了。
我还不完全理解 Java 中的安全流程是如何工作的,但我很想在尝试连接 SockJS 时需要通过握手传递 JWT 令牌。据我了解,这对于 SockJS 是不可能的。所以我只是在想用 JWT 启动套接字的最佳方法是什么。另外,我知道我没有启用 CSRF,所以一些提示也很好。
在WebSecurityConfig.java中:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.cors();
httpSecurity.csrf().disable()
.authorizeRequests()
.antMatchers("/authenticate", "/login", "/register").permitAll()
.anyRequest().authenticated().and()
.exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}
}
在WebSocketConfig.java中:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("http://localhost:5000")
.withSockJS();
}
}
在我的 Vue 应用程序中。正在尝试连接 JS:
connect() {
this.socket = new SockJS("http://localhost:8080/ws");
this.stompClient = Stomp.over(this.socket);
this.stompClient.connect(
{
token: 'Bearer ' + localStorage.getItem('user-token')
},
frame => {
this.connected = true;
console.log(frame);
this.stompClient.subscribe("/topic/greetings", tick => {
console.log(tick);
this.received_messages.push(JSON.parse(tick.body).content);
});
},
error => {
console.log(error);
this.connected = false;
})
},
如果我删除所有安全配置,我就可以很好地连接到 WebSocket。
我希望能够连接到 WebSocket,但现在我收到了 401,并且在进行握手时我无法找到身份验证的方法。
自用遮阳篷
我通过禁用 WebSecurityConfig.java
中握手路径的安全性来解决这个问题
.antMatchers(
"/authenticate",
"/login",
"/register",
"/secured/chat/**").permitAll()
我想我现在必须通过套接字对用户进行身份验证,因为这会使套接字对任何人开放,这是我真正不想要的。
我有一个可用的 Spring 引导服务器 Authentication/Authorization。当尝试打开与 SockJS 的连接时,它被我的其他安全措施阻止了。
我还不完全理解 Java 中的安全流程是如何工作的,但我很想在尝试连接 SockJS 时需要通过握手传递 JWT 令牌。据我了解,这对于 SockJS 是不可能的。所以我只是在想用 JWT 启动套接字的最佳方法是什么。另外,我知道我没有启用 CSRF,所以一些提示也很好。
在WebSecurityConfig.java中:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.cors();
httpSecurity.csrf().disable()
.authorizeRequests()
.antMatchers("/authenticate", "/login", "/register").permitAll()
.anyRequest().authenticated().and()
.exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}
}
在WebSocketConfig.java中:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("http://localhost:5000")
.withSockJS();
}
}
在我的 Vue 应用程序中。正在尝试连接 JS:
connect() {
this.socket = new SockJS("http://localhost:8080/ws");
this.stompClient = Stomp.over(this.socket);
this.stompClient.connect(
{
token: 'Bearer ' + localStorage.getItem('user-token')
},
frame => {
this.connected = true;
console.log(frame);
this.stompClient.subscribe("/topic/greetings", tick => {
console.log(tick);
this.received_messages.push(JSON.parse(tick.body).content);
});
},
error => {
console.log(error);
this.connected = false;
})
},
如果我删除所有安全配置,我就可以很好地连接到 WebSocket。
我希望能够连接到 WebSocket,但现在我收到了 401,并且在进行握手时我无法找到身份验证的方法。
自用遮阳篷
我通过禁用 WebSecurityConfig.java
中握手路径的安全性来解决这个问题
.antMatchers(
"/authenticate",
"/login",
"/register",
"/secured/chat/**").permitAll()
我想我现在必须通过套接字对用户进行身份验证,因为这会使套接字对任何人开放,这是我真正不想要的。