Je suis à l'aide d' Auth0
pour mon authentification de l'utilisateur pour autoriser uniquement les utilisateurs enregistrés d'accéder à un Ressort (Boot) RestController
. À ce point, je suis de créer en temps réel une fonctionnalité de message, où les utilisateurs peuvent envoyer des messages à partir de l' Angular 2
client (localhost:4200
) pour le Printemps serveur (localhost:8081) à l'aide d' stompjs
et sockjs
.
Lorsque vous essayez de créer un Stomp-client et le démarrage d'une connexion j'ai le message suivant dans la console d'erreur:
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's 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.
Après des recherches sur ce problème, il semble comme il n'est pas possible de définir l'option origines = * et les informations d'identification = true dans le même temps. Comment puis-je résoudre ce problème quand j'ai déjà le permis origine dans le WebSocketConfig pour le client de domaine?
Angulaire à 2 composants
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();
}
}
localhost:8081/chat/info?t=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 (temporairement permet à tous)
public class SecurityConfig extends Auth0SecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll();
}
}
Mise à JOUR
Après quelques tests supplémentaires et de la recherche, il semble que le problème se produit uniquement à l'aide de Chrome. Problème peut-être lié à: https://github.com/sockjs/sockjs-node/issues/177
Mise à JOUR
J'ai créé le CORSFilter comme chsdk mentionné et utilisé le addFilterBefore() la méthode: https://stackoverflow.com/a/40300363/4836952.
@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();
}
Je peux voir que le Filtre est appelé par le débogage, mais le message d'erreur continue à apparaître sur le côté client, même si la bonne Access-Control-Allow-Origin est: