Printemps de sécurité de la SCRO Filtre
Nous avons ajouté Spring Security
à notre projet.
À partir de ce moment, nous obtenons un 401 No 'Access-Control-Allow-Origin' header is present on the requested resource
erreur de notre serveur.
C'est parce que pas Access-Control-Allow-Origin
en-tête est jointe à la réponse. Pour corriger cela, nous avons ajouté notre propre filtre qui est dans le Filter
de la chaîne avant la déconnexion du filtre, mais le filtre ne s'applique pas à nos demandes.
Notre Erreur:
XMLHttpRequest ne peut pas charger
http://localhost:8080/getKunden
. Pas de "Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée. Originehttp://localhost:3000
est donc pas autorisé à accéder. La réponse avait le code d'état HTTP 401.
Notre configuration de la Sécurité:
@EnableWebSecurity
@Configuration
@ComponentScan("com.company.praktikant")
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private MyFilter filter;
@Override
public void configure(HttpSecurity http) throws Exception {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
source.registerCorsConfiguration("/**", config);
http.addFilterBefore(new MyFilter(), LogoutFilter.class).authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/*").permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
}
}
Notre filtre
@Component
public class MyFilter extends OncePerRequestFilter {
@Override
public void destroy() {
}
private String getAllowedDomainsRegex() {
return "individual /customized Regex";
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
final String origin = "http://localhost:3000";
response.addHeader("Access-Control-Allow-Origin", origin);
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers",
"content-type, x-gwt-module-base, x-gwt-permutation, clientid, longpush");
filterChain.doFilter(request, response);
}
}
Notre Application
@SpringBootApplication
public class Application {
public static void main(String[] args) {
final ApplicationContext ctx = SpringApplication.run(Application.class, args);
final AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(CORSConfig.class);
annotationConfigApplicationContext.refresh();
}
}
Notre filtre est enregistré à partir du printemps-boot:
2016-11-04 09:19:51.494 INFO 9704 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Cartographie de filtre: 'myFilter': [ /* ]
Notre généré filterchain:
2016-11-04 09:19:52.729 INFO 9704 --- [ost-startStop-1] o.s.s.web.DefaultSecurityFilterChain : Création d'un filtre de la chaîne: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5d8c5a8a, org.springframework.security.web.context.SecurityContextPersistenceFilter@7d6938f, org.springframework.security.web.header.HeaderWriterFilter@72aa89c, org.springframework.security.web.csrf.CsrfFilter@4af4df11, com.company.praktikant.MyFilter@5ba65db2, org.springframework.security.web.authentication.logout.LogoutFilter@2330834f, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@396532d1, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4fc0f1a2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2357120f, org.springframework.security.web.session.SessionManagementFilter@10867bfb, org.springframework.security.web.access.ExceptionTranslationFilter@4b8bf1fb, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@42063cf1]
La Réponse:
En-têtes de réponse
Nous avons essayé la solution de printemps, mais il ne fonctionne pas! L'annotation @CrossOrigin dans notre contrôleur n'a pas aider non plus.
Edit 1:
Essayé la solution de @Piotr Sołtysiak.
Le cors du filtre n'est pas répertorié dans le générés chaîne de filtrage et nous obtenons toujours la même erreur.
2016-11-04 10:22:49.881 INFO 8820 --- [ost-startStop-1] o.s.s.web.DefaultSecurityFilterChain : Création d'un filtre de la chaîne: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4c191377, org.springframework.security.web.context.SecurityContextPersistenceFilter@28bad32a, org.springframework.security.web.header.HeaderWriterFilter@3c3ec668, org.springframework.security.web.csrf.CsrfFilter@288460dd, org.springframework.security.web.authentication.logout.LogoutFilter@1c9cd096, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3990c331, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@1e8d4ac1, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@2d61d2a4, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@380d9a9b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@abf2de3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2a5c161b, org.springframework.security.web.session.SessionManagementFilter@3c1fd3e5, org.springframework.security.web.access.ExceptionTranslationFilter@3d7055ef, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@5d27725a]
Btw nous sommes à l'aide de spring-security version 4.1.3.!
Nous avons essayé avec le Bord et il travaille... mais firefox ne fonctionne pas ainsi.
J'ai eu le même problème je le résoudre en ajoutant
127.0.0.1 localhost local.net
à /etc/hosts
puis appeler local.net:8080/getKundenvoir stackoverflow.com/questions/28547288/... il pourrait aider
OriginalL'auteur M. Thiele | 2016-11-04
Vous devez vous connecter pour publier un commentaire.
Depuis le Printemps de Sécurité 4.1, c'est la bonne façon de faire de Ressort d'appui à la Sécurité de la SCRO (également nécessaires dans le Printemps de Démarrage 1.4/1.5):
et:
Ne pas faire tout de ci-dessous, qui sont la mauvaise façon de tenter de résoudre le problème:
http.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll();
web.ignoring().antMatchers(HttpMethod.OPTIONS);
Référence: http://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/cors.html
the http.csrf().disable()
, car une fois qu'il est supprimé, j'ai obtenu l'erreur:Could not verify the provided CSRF token because your session was not found
Réponse parfaite... même Si pour moi j'ai eu de décommenter http.csrf().disable();
Si vous n'utilisez pas de Goyave, vous pouvez toujours le faire:
Collections.unmodifiableList(Arrays.asList("HEAD",...))
Cela ne fonctionne pas avec Firefox clients si votre application fonctionne dans un 2-way de l'environnement SSL à l'aide de certificats x509. Printemps de Sécurité prévoit toujours que les informations d'identification sur les OPTIONS de demande, ce qui est en violation de la SCRO spec: fetch.spec.whatwg.org/#cors-preflight-fetch, et, malheureusement, Firefox strictement conforme à cette spécification et arrache les informations d'identification dans le contrôle en amont des demandes.
Veuillez noter que WebMvcConfigurerAdapter est obsolète maintenant.
OriginalL'auteur Hendy Irawan
Ok, après 2 jours de recherche nous avons enfin résolu le problème. Nous avons supprimé tous nos filtre et des configurations plutôt utilisé ce 5 lignes de code dans la classe d'application.
OriginalL'auteur M. Thiele
Depuis j'ai eu des problèmes avec les autres solutions (en particulier pour qu'il fonctionne dans tous les navigateurs, par exemple edge ne reconnaît pas "*" comme une valeur valide pour "Access-Control-Allow-Méthodes"), j'ai dû utiliser un Filtre personnalisé Composant, qui à la fin a travaillé pour moi et fait exactement ce que je voulais obtenir.
OriginalL'auteur David Eibensteiner
Vous n'avez pas besoin:
@EnableWebSecurity
a déjà@Configuration
en elle, et je ne peux pas imaginer pourquoi vous mettez@ComponentScan
.Sur la SCRO filtre, je viens de mettre cela:
En SecurityConfiguration de classe et de supprimer les configurer et de les configurer les méthodes globales. Vous n'avez pas besoin de allowde orgins, les en-têtes et les méthodes à deux reprises. Surtout si vous mettez des propriétés différentes dans le filtre et de la sécurité printemps config 🙂
D'après ci-dessus, votre "MyFilter" la classe est redondant.
Vous pouvez également supprimer ces:
De la classe d'Application.
À la fin des petits conseils - pas connecté à la question. Vous ne voulez pas mettre les verbes à URI. Au lieu de
http://localhost:8080/getKunden
vous devez utiliser la méthode HTTP GET surhttp://localhost:8080/kunden
de ressources. Vous pouvez en apprendre davantage sur les meilleures pratiques pour la conception d'api RESTful ici: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-apiOriginalL'auteur Piotr Sołtysiak
Dans mon cas, j'ai juste ajouté cette classe et de l'utiliser @EnableAutConfiguration
}
OriginalL'auteur Alex Fernandez
Selon la CORS du filtre de la documentation:
Quelque chose comme ceci permettra
GET
l'accès à la/ajaxUri
:Bien sûr, votre SpringSecurity configuration doit permettre l'accès à l'URI avec l'une des méthodes. Voir @Hendy Irawan réponse.
OriginalL'auteur lmiguelmh
Dans de nombreux endroits, je vois la réponse qui a besoin d'ajouter ce code:
mais dans mon cas, il déclenche une classe inattendue de type exception.
corsFilter()
fève nécessiteCorsFilter
type, donc j'ai fait des changements et de mettre cette définition du bean dans ma config et tout est OK maintenant.OriginalL'auteur Garik Kalashyan
Pour les programmes déjà en place et ne peuvent pas se permettre les changements de code (E. g ajouter/mise à jour de printemps de sécurité), l'ajout d'un simple proxy est une solution: https://stackoverflow.com/a/49827300/1758194
OriginalL'auteur Orvyl