Ich habe Probleme mit der Integration der Federsicherheit (nämlich des Login-Teils) in meiner Webanwendung. Mein BackEnd läuft unter localhost: 8080 und das FrontEnd (Ionic 2 mit AngularJS 2) läuft unter localhost: 8100. Ich konnte einloggen (zumindest glaube ich so), aber der Rest der Anfragen nicht mehr zur Verfügung, und ich bekomme die folgenden Fehler in der Chrome-Entwicklerkonsole:Spring Security Login mit Java und Angular2
XMLHttpRequest cannot load http://localhost:8080/company/getAll. Response for preflight is invalid (redirect)
Wenn mit Postman testet es scheint zu funktionieren, ich einloggen und dann kann ich POST-Anfragen unter http://localhost:8080/company/getAll ausführen und alles funktioniert wie vorgesehen.
Vermutlich vermisse ich etwas (wie ein Token), kann aber nicht herausfinden, was. Ich bin sowohl mit Ionic als auch mit Spring Security neu, also bitte vergib mir, wenn das etwas Triviales ist. Ich habe versucht, verschiedene Tutorials zu googlen, konnte aber nichts finden (die meisten benutzten JSP).
Wie könnte ich das zur Arbeit bringen? Wie sollen meine Anfragen vom Frontend aussehen?
Hier ist meine Login-Methode vom Back-End-Controller:
@Configuration
@EnableWebSecurity
@ComponentScan("com.SAB.service")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**", "/registration").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/user/login")
.permitAll()
.and()
.logout()
.permitAll();
http
.csrf().disable();
http.formLogin().defaultSuccessUrl("http://localhost:8100/", true);
//.and().exceptionHandling().accessDeniedPage("/403")
//.and().sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true);
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
}
}
Und schließlich mein FrontEnd Code verantwortlich für die Anmeldung:
login(){
var body = 'username='+this.loginForm.controls['username'].value+'&password='+this.loginForm.controls['password'].value;
var headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
//headers.append("Access-Control-Allow-Origin", "*");
this.http
.post('http://localhost:8080/user/login',
body, {
headers: headers
})
.subscribe(data => {
console.log('ok');
console.log(data)
}, error => {
console.log(JSON.stringify(error.json()));
});
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
@CrossOrigin(origins = "*")
public ResponseEntity<GeneralResponse> login(Model model, String error, String logout) {
System.out.println("LOGIN"+model.toString());
if (error != null) {
System.out.println("1.IF");
model.addAttribute("error", "Your username and password is invalid.");
}
if (logout != null) {
System.out.println("2.IF");
model.addAttribute("message", "You have been logged out successfully.");
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new GeneralResponse(true, "FAILURE: Error"));
}
Das ist mein WebSecurityConfig ist Wenn Sie weitere Details benötigen, lassen Sie es mich wissen und ich werde sie zur Verfügung stellen.
Vielen Dank im Voraus!
ich die Access-Controll-Origin-Fehler nicht bekommen, aber ich habe versucht, es trotzdem zu den Kommentaren nach ändern und ich jetzt eine „Invalid CORS Anfrage“
Request und Response-Header für die Anmeldung von Postbote:
EDIT: Hier sind die Spring Security-Protokolle. Spring registriert jedoch nur eine OPTIONS-Anforderung und kein POST, obwohl das FrontEnd POST aufruft.
************************************************************
Request received for OPTIONS '/login':
[email protected]
servletPath:/login
pathInfo:null
headers:
host: localhost:8080
connection: keep-alive
access-control-request-method: POST
origin: http://localhost:8100
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36
access-control-request-headers: access-control-allow-origin
accept: */*
referer: http://localhost:8100/
accept-encoding: gzip, deflate, sdch, br
accept-language: en-US,en;q=0.8
Security filter chain: [
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
CorsFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
]
************************************************************
2017-05-12 19:18:28.527 DEBUG 16500 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : /login at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2017-05-12 19:18:28.527 DEBUG 16500 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : /login at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2017-05-12 19:18:28.527 DEBUG 16500 --- [nio-8080-exec-1] w.c.HttpSessionSecurityContextRepository : No HttpSession currently exists
2017-05-12 19:18:28.527 DEBUG 16500 --- [nio-8080-exec-1] w.c.HttpSessionSecurityContextRepository : No SecurityContext was available from the HttpSession: null. A new one will be created.
2017-05-12 19:18:28.529 DEBUG 16500 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : /login at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2017-05-12 19:18:28.529 DEBUG 16500 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : /login at position 4 of 12 in additional filter chain; firing Filter: 'CorsFilter'
2017-05-12 19:18:28.541 DEBUG 16500 --- [nio-8080-exec-1] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match the requestMatcher org.springframework.se[email protected]5baaaa2b
2017-05-12 19:18:28.541 DEBUG 16500 --- [nio-8080-exec-1] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2017-05-12 19:18:28.541 DEBUG 16500 --- [nio-8080-exec-1] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
UPDATE: So nach dem Hinzufügen der CORSFilter in der akzeptierte Antwort schlug ich hatte auch meine Wünsche im Frontend, damit das Cookie mit dem JSESSIONID ändern bei jeder Anfrage gesendet werden. Bassistisch musste ich ALLES zu meinen Anfragen hinzufügen: let options = new RequestOptions({ headers: headers, withCredentials: true });
Dies ist definitiv ein CORS-Konfigurationsproblem. – galovics
hast du http://stackoverflow.com/questions/33645511/why-my-ajax-showing-preflight-is-invalid-redirect-error –