У меня есть рабочий сервер Spring Boot с аутентификацией / авторизацией. При попытке открыть соединение с SockJS оно блокируется другими моими мерами безопасности.
Я не до конца понимаю, как работает поток безопасности в Java, но у меня есть зуд, что мне нужно передать токен JWT рукопожатием при попытке соединения с SockJS. Из того, что я понимаю, это невозможно с 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, и я не могу найти способ аутентификации при выполнении рукопожатия.