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
- stackoverflow.com/a/35040051/2884309 <- cette solution fonctionne encore sur spring-boot 1.5.6
Vous devez vous connecter pour publier un commentaire.
Printemps de Sécurité peuvent désormais tirer parti de Spring MVC, le soutien de la SCRO décrit dans ce blog j'ai écrit.
Pour le faire fonctionner, vous devez activer explicitement le soutien de la SCRO au Printemps de Sécurité au niveau suivant, sinon de la SCRO activé, les demandes peuvent être bloqués par le Printemps de Sécurité avant d'atteindre Spring MVC.
Si vous utilisez un contrôleur de niveau
@CrossOrigin
annotations, vous avez juste à activer le Printemps de Sécurité le soutien de la SCRO et mettra à profit les Spring MVC configuration:Si vous préférez l'utilisation de la SCRO mondial de configuration, vous pouvez déclarer une
CorsConfigurationSource
bean comme suit:Cette approche remplace le filtre approche fondée sur les recommandé précédemment.
Vous pouvez trouver plus de détails dans la dédié de la SCRO section de Printemps de Sécurité de la documentation.
CorsFilter
bean. Pour une raison quelconque, le FilterRegistrationBean n'a pas été reprise.Si vous utilisez le JDK 8+, il y a une ligne lambda solution:
Si vous utilisez le Printemps de Sécurité, vous pouvez effectuer les opérations suivantes pour s'assurer que la SCRO les demandes sont traitées en premier:
Voir Printemps 4.2.x de la SCRO pour plus d'informations.
Origine de la croix-protection est une fonctionnalité du navigateur. Curl ne prend pas soin de la SCRO, comme vous le présumé.
Ce qui explique pourquoi votre boucles sont couronnées de succès, tandis que les requêtes du navigateur ne sont pas.
Si vous envoyez la requête du navigateur avec le mauvais identifiants, le printemps va essayer de transmettre le client vers une page de connexion.
Cette réponse (hors de la page de connexion) ne pas contenir l'en-tête "Access-Control-Allow-Origin" et le navigateur réagit comme vous le décrivez.
Vous devez faire le printemps pour inclure le haeder pour cette connexion de réponse, et peut-être pour d'autres, tout comme les pages d'erreur, etc.
Ce qui peut être fait comme ceci :
C'est copié à partir de la scro-soutien-au-printemps-cadre
Je voudrais commencer par l'ajout de la scro cartographie de toutes les ressources avec :
et aussi de permettre à toutes les méthodes d'en-têtes..
Une fois que cela fonctionne, vous pouvez commencer à réduire de nouveau pour le besoin minimum.
Veuillez noter, que les CORS des changements de configuration avec la Version 4.2.
Si cela ne résout pas vos problèmes, post la réponse que vous obtenez à partir de l'échec de la requête ajax.
Pour la configuration des propriétés de
Trouvé une solution facile pour le Printemps-Démarrage, Printemps-la Sécurité et la Java config:
J'ai résolu ce problème en:
et:
J'ai résolu ce problème en:
`
`
De la scro peut être une douleur dans le cul, mais avec ce simple code vous de la Scro SEULEMENT!!!!!!! à la à la méthode spécifiée
Comme un charme au printemps de démarrage 2.0.2
J'ai eu le même problème sur un methood qui renvoie l'état du serveur.
L'application est déployée sur plusieurs serveurs. Donc, le plus simple que j'ai trouvé est d'ajouter
Cette méthode n'est pas sécurisé, mais vous pouvez ajouter
allowCredentials
pour que.J'ai eu de gros problèmes avec Axios, le Printemps de Démarrage et de la Sécurité Printemps avec authentification.
Veuillez noter que la version de Printemps de Démarrage et le Printemps de Sécurité, vous êtes à l'aide de questions.
Printemps De Démarrage: 1.5.10
Printemps: 4.3.14
Printemps De Sécurité 4.2.4
Pour résoudre ce problème à l'aide de l'Annotation Java Configuration que j'ai créé la classe suivante:
L'un des principaux problèmes avec Axios est que lorsque votre API requiert une authentification, il envoie un en-tête d'Autorisation à la demande OPTIONS. Si vous n'incluez pas l'Autorisation dans les en-têtes de configuration, les OPTIONS de demande (aka demande de contrôle en amont) échouera et Axios signale une erreur.
Comme vous pouvez le voir avec un couple de simple et placés correctement les paramètres de configuration de la SCRO avec SpringBoot est assez facile.
Kotlin solution
Après beaucoup de recherche de l'erreur venant de javascript de la SCRO, la seule solution que j'ai trouvé pour cette affaire était la configuration de la scro du Printemps de la même classe org.springframework.web.la scro.CorsConfiguration.CorsConfiguration()