CORS-Problem - Keine "Access-Control-Allow-Origin' - header vorhanden ist, auf die angeforderte Ressource
Erstellt habe ich zwei web - Applikationen- Kunden-und service-apps.
Die Interaktion zwischen client und service-apps geht in Ordnung, wenn Sie eingesetzt werden, in derselben Tomcat-Instanz.
Aber wenn die apps bereitgestellt werden, in separate Tomcat-Instanzen (verschiedene Maschinen), bekomme ich die folgende Fehlermeldung, wenn Anfrage gesendet service-app.
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 401
Meine Client-Anwendung nutzt JQuery, HTML5 und Bootstrap.
AJAX-Aufruf gemacht, um service wie unten gezeigt:
var auth = "Basic " + btoa({usname} + ":" + {password});
var service_url = {serviceAppDomainName}/services;
if($("#registrationForm").valid()){
var formData = JSON.stringify(getFormData(registrationForm));
$.ajax({
url: service_url+action,
dataType: 'json',
async: false,
type: 'POST',
headers:{
"Authorization":auth
},
contentType: 'application/json',
data: formData,
success: function(data){
//success code
},
error: function( jqXhr, textStatus, errorThrown ){
alert( errorThrown );
});
}
Mein service-Anwendung verwendet, Spring MVC, Spring Data JPA und Spring Security.
Ich habe CorsConfiguration
Klasse, wie unten gezeigt:
CORSConfig.java
:
@Configuration
@EnableWebMvc
public class CORSConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("*");
}
}
SecurityConfig.java
:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@ComponentScan(basePackages = "com.services", scopedProxy = ScopedProxyMode.INTERFACES)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("authenticationService")
private UserDetailsService userDetailsService;
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
auth.authenticationProvider(authenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().fullyAuthenticated();
http.httpBasic();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.csrf().disable();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}
}
Spring Security-Abhängigkeiten:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
Ich bin mit Apache Tomcat Servers für die Bereitstellung.
InformationsquelleAutor JavaDeveloper | 2017-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
CORS' preflight-request HTTP verwendet
OPTIONS
ohne Anmeldeinformationen finden Sie unter Cross-Origin Resource Sharing:Müssen Sie den anonymen Zugriff für den HTTP -
OPTIONS
.Ihrer modifizierten (und vereinfachte) code:
Da Spring Security 4.2.0 können Sie die integrierte Unterstützung finden Spring Security Referenz:
.andMatchers(HttpMethod.OPTIONS, "/**").permitAll()
nie für mich gearbeitet, es gab nicht die richtige CORS-Header aufOPTIONS
. Nur das Spring Security-genehmigt CORS-Technik funktioniert.Noch immer CORS-Fehler, wenn Sie versuchen, diese Lösung:
[...] has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
InformationsquelleAutor dur
Da Spring Security 4.1, das ist der richtige Weg, um Spring Security support CORS (auch in Spring-Boot-1.4/1.5):
und:
Tun nicht haben unten, die sind der falsche Weg, zu versuchen, die Lösung des Problems:
http.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll();
web.ignoring().antMatchers(HttpMethod.OPTIONS);
Referenz: http://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/cors.html
Arbeitete für mich, aber ich hatte für die Verwendung von http.csrf().disable (), weil iOS-und Android-Apps blockiert werden würde, wenn nicht aktiviert. Jetzt beide arbeiten, WEB und Mobile.
InformationsquelleAutor Hendy Irawan
In meinem Fall habe ich die Resource Server mit OAuth security aktiviert, und alle der oben genannten Lösungen nicht funktioniert hat. Nach einigem Debuggen und googeln herausgefunden, warum.
Grundsätzlich in diesem Beispiel
Ordered.HIGHEST_PRECEDENCE
ist der Schlüssel!https://github.com/spring-projects/spring-security-oauth/issues/938
Verschiedenen pom Abhängigkeiten hinzufügen von verschiedenen Arten von filtern und somit konnten wir Probleme haben basierend auf der Reihenfolge.
InformationsquelleAutor AntonIva