Comment configurer la SCRO, au Printemps de Démarrage + Printemps application de Sécurité?

- Je utiliser le Printemps de Démarrage avec le Printemps, la Sécurité et le Soutien de la Scro.

Si j'ai exécuter le code suivant

url = 'http://localhost:5000/api/token'
xmlhttp = new XMLHttpRequest
xmlhttp.onreadystatechange = ->
    if xmlhttp.readyState is 4
        console.log xmlhttp.status
xmlhttp.open "GET", url, true
# xmlhttp.setRequestHeader "X-Requested-With", "XMLHttpRequest"
xmlhttp.setRequestHeader 'Authorization', 'Basic ' + btoa 'a:a'
do xmlhttp.send

Je obtenir comme résultat

200

Si je test avec de fausses informations d'identification comme

url = 'http://localhost:5000/api/token'
xmlhttp = new XMLHttpRequest
xmlhttp.onreadystatechange = ->
    if xmlhttp.readyState is 4
        console.log xmlhttp.status
xmlhttp.open "GET", url, true
# xmlhttp.setRequestHeader "X-Requested-With", "XMLHttpRequest"
xmlhttp.setRequestHeader 'Authorization', 'Basic ' + btoa 'a:aa'
do xmlhttp.send

au lieu de se 401 (qui est le code standard pour le mal de l'authentification au printemps de sécurité), j'ai

0

avec navigateur suivant la notification:

OBTENIR http://localhost:5000/api/token

XMLHttpRequest ne peut pas charger http://localhost:5000. Pas de "Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée. Origine " http://localhost:3000 ' est donc pas autorisé à accéder. La réponse avait le code d'état HTTP 401.

Je suis en développement front-end code qui a besoin d'utile codes d'état http de réponses du serveur pour gérer la situation. J'ai besoin de quelque chose de plus utile que de 0. Aussi le corps de la réponse est vide. Je ne sais pas si ma config est mal, ou c'est un bug logiciel et je ne sais pas où, si c'est le chrome (à l'aide d'arch linux) ou à une source de sécurité.

Mon Printemps Config est:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@RestController
@RequestMapping("api")
public class Controller {
    @RequestMapping("token")
    @CrossOrigin
    Map<String, String> token(HttpSession session) {
        return Collections.singletonMap("token", session.getId());
    }
}

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("a").password("a").roles("USER");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                .anyRequest().authenticated()
                .and().httpBasic();
    }
}

Si je test avec curl tout fonctionne parfaitement, je pense que sans le soutien de la SCRO nécessaire, mais j'ai essayé de simuler la SCRO avec OPTION de demande et le résultat était aussi ok.

$ curl -v localhost:5000/api/token -H "Authorization: Basic YTpha"
*   Trying ::1...
* Connected to localhost (::1) port 5000 (#0)
> GET /api/token HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.48.0
> Accept: */*
> Authorization: Basic YTpha
> 
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Access-Control-Allow-Origin: http://localhost:3000
< Access-Control-Allow-Methods: POST,GET,OPTIONS,DELETE
< Access-Control-Max-Age: 3600
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: Origin,Accept,X-Requested-    With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization
< x-auth-token: 58e4cca9-7719-46c8-9180-2fc16aec8dff
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 01 May 2016 16:15:44 GMT
< 
* Connection #0 to host localhost left intact
{"token":"58e4cca9-7719-46c8-9180-2fc16aec8dff"}

et avec de fausses informations d'identification:

$ curl -v localhost:5000/api/token -H "Authorization: Basic YTp"
*   Trying ::1...
* Connected to localhost (::1) port 5000 (#0)
> GET /api/token HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.48.0
> Accept: */*
> Authorization: Basic YTp
> 
< HTTP/1.1 401 Unauthorized
< Server: Apache-Coyote/1.1
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< WWW-Authenticate: Basic realm="Realm"
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 01 May 2016 16:16:15 GMT
< 
* Connection #0 to host localhost left intact
{"timestamp":1462119375041,"status":401,"error":"Unauthorized","message":"Failed to decode basic authentication token","path":"/api/token"}

Edit:
Pour éviter les malentendus. J'utilise 1.3.3 Printemps de Démarrage.
Le billet de Blog écrit:

Le soutien de la SCRO sera disponible dans le prochain Printemps de Démarrage de la version 1.3, et est déjà disponible dans la 1.3.0.CONSTRUIRE-INSTANTANÉ construit.

À l'aide de la méthode du contrôleur de la SCRO configuration avec @CrossOrigin annotations au Printemps de Démarrage de l'application ne nécessite pas de configuration spécifique.

Mondiale de la SCRO configuration peut être définie par l'enregistrement d'un WebMvcConfigurer bean avec une ambiance addCorsMappings(CorsRegistry) méthode:

J'ai ajouté le code suivant pour activer la mondial de le soutien de la scro. en fait, j'ai essayé cela avant, mais le résultat était le même. J'ai réessayé récemment et le résultat est le même.

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

L'idée que le problème vient d'une redirection entre le processus d'autorisation est intéressant cependant. comment puis-je changer la redirection vers des ressources pour éviter ce conflit?

EDIT:

Je suppose que je suis plus proche d'une solution. J'ai testé avec mon nodejs server qui prend en charge la scro sans problème par l'ajout d'
Access-Control-Allow-Origin: *
pour toutes les demandes.

Comme Stefan Isele l'a déjà mentionné, il semble que le printemps de sécurité redirections ou ne pas ajouter de la SCRO en-tête de sorte que c'est pourquoi la demande semble être rompu. Ainsi, alors que la sécurité printemps est la vérification de l'authentification, il a plus qu'à ajouter le bon en-tête.

Personne ne sait comment le faire?

EDIT:

J'ai trouvé une solution de contournement, qui semble être moche. J'ai commencé un github problème pour le printemps de démarrage où je décris la solution de contournement: https://github.com/spring-projects/spring-boot/issues/5834