1 pièce(s) jointe(s)
Spring security - login en ajax (api rest) -> erreur 401
Bonjour à tous,
je suis en train d'implémenter un processus d'authentification pour une appli web (backend: java spring boot, front-end: angular) et je suis confronté à un problème depuis plus d'une semaine.
Jusqu'à présent j'ai réussi à faire un code qui gère l'authentification en me redirigeant vers une page de login auto-générée par spring, mais je voudrais éviter ce comportement car mon backend fournit une api (et la page de login est gérée par angular). J'ai donc configuré spring security ainsi :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| @Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("authUserDetailsService")
private UserDetailsService authUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// permet l'accès au endpoint "/login" pour les utilisateurs non authentifiés et leur bloque les autres endpoints
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
// 401-UNAUTHORIZED quand on tente d'accéder à une url sans authentification (au lieu de rediriger vers une page de login)
.and()
.exceptionHandling()
.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
// permet de s'authentifier avec la méthode Post (en passant le username et le password) et renvoie un 204-NO_CONTENT quand l'authentification réussi (pas de redirection) et 401-UNAUTHORIZED sinon
.and()
.formLogin()
.successHandler((req, res, auth) -> res.setStatus(HttpStatus.NO_CONTENT.value()))
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
// endpoint pour le logout qui renvoie 204-NO_CONTENT (pas de redirection)
.and()
.logout()
.deleteCookies("JSESSIONID")
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.NO_CONTENT))
// protection CSRF
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
// utilise mon service authUserDetailsService pour gérer l'authenfication (utilisateurs stockés en base de donnée)
@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
authManagerBuilder.userDetailsService(authUserDetailsService).passwordEncoder(passwordEncoder());
}
// pour le moment je n'utilise pas d'encodage de password pour simplifier les tests
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance(); //TODO: replace by new BCryptPasswordEncoder()
}
} |
J'ai aussi créé ce service côté client pour permettre une authentification avec un appel à l'api, grâce à une requête ajax :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Injectable({
providedIn: 'root'
})
export class AuthenticationService {
private loginUrl = environment.apiUrl + "login"
constructor(private http: HttpClient) {}
// envoie une requête Post avec le username et le password
public authenticate(username, password): Promise<boolean> {
return new Promise( resolve =>
this.http.post(this.loginUrl, {"username": username, "password": password}).subscribe(
reponse => resolve(true),
error => resolve(false)
)
)
}
} |
Mon soucis est que cet appel d'api génère une erreur 401, ce qui signifie donc qu'il y a une une erreur d'authentification, mais je suis incapable de savoir quelle est cette erreur (aucune info dans les logs) :
Pièce jointe 600235
Est-ce que quelqu'un aurait une idée de ce qui ne va pas ?
Merci beaucoup d'avance !