JWT-аутентификация блокирует рукопожатие SockJS при попытке установить соединение WebSocket - PullRequest
0 голосов
/ 21 октября 2019

У меня есть рабочий сервер 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, и я не могу найти способ аутентификации при выполнении рукопожатия.

1 Ответ

0 голосов
/ 22 октября 2019

Self-awnser

Я обошел стороной, отключив защиту для путей рукопожатия в WebSecurityConfig.java, как это

.antMatchers(
  "/authenticate", 
  "/login", 
  "/register",
  "/secured/chat/**").permitAll()

Я предполагаю, что должен аутентифицировать пользователя через сокеттеперь, так как это делает сокет открытым для всех, то, чего я действительно не хотел. Я обновлю этот awnser, если найду лучший способ сделать это.

...