Я использую Auth0
для моей аутентификации пользователей, чтобы разрешить вход в систему только пользователям с доступом к Spring (Boot) RestController
. На данный момент я создаю функциональность сообщений в режиме реального времени, когда пользователи могут отправлять сообщения от клиента Angular 2
(localhost:4200
) на сервер Spring (localhost: 8081) с помощью stompjs
и sockjs
.
При попытке создать Stomp-клиент и запуск соединения я получаю следующую консольную ошибку:
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request credentials mode is 'include'. Origin 'http://localhost:4200' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
После изучения этой проблемы, похоже, невозможно одновременно установить параметр originins = * и credentials = true. Как разрешить это, если я уже установил разрешенное происхождение в WebSocketConfig для домена клиента?
Angular 2 компонента
connect() {
var socket = new SockJS('http://localhost:8081/chat');
this.stompClient = Stomp.over(socket);
this.stompClient.connect({}, function(result) {
console.log('Connected: ' + result);
this.stompClient.subscribe('/topic/messages', function(message) {
console.log(message);
});
});
}
WebSocketConfig
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat").setAllowedOrigins("http://localhost:4200").withSockJS();
}
}
локальный: 8081/чат/информация т = 1490866768565
{"entropy":-1720701276,"origins":["*:*"],"cookie_needed":true,"websocket":true}
MessageController
public class MessageController {
@MessageMapping("/chat")
@SendTo("/topic/messages")
public Message send(Message message) throws Exception {
return new Message(message.getFrom(), message.getText());
}
}
SecurityConfig (временно разрешает все)
public class SecurityConfig extends Auth0SecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll();
}
}
UPDATE
После нескольких тестов и исследований кажется, что проблема возникает только с помощью Chrome. Проблема может быть связана с: https://github.com/sockjs/sockjs-node/issues/177
UPDATE
Я создал CORSFilter, например chsdk, и использовал метод addFilterBefore(): qaru.site/info/33420/....
@Bean
CORSFilter corsFilter() {
CORSFilter filter = new CORSFilter();
return filter;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(corsFilter(), SessionManagementFilter.class).authorizeRequests().anyRequest().permitAll();
http.csrf().disable();
}
Я вижу, что фильтр вызывается путем отладки, но сообщение об ошибке продолжает появляться на клиентской стороне, даже если установлен правильный параметр Access-Control-Allow-Origin: