C'est un mémorandum parce que j'ai enquêté sur l'authentification de Spring Security.
SecurityFilterChain est appliqué à la demande. Par défaut, UsernamePasswordAuthenticationFilter est responsable de l'authentification (s'applique aux chemins spécifiés, par exemple / login). AuthenticationManager est appelé depuis Filter et décide de s'authentifier ou non. AuthenticationManager a plusieurs fournisseurs d'authentification et délègue le traitement des autorisations / refus d'authentification à chaque fournisseur.
AuthenticationFilter Il est appliqué à l'URL qui exécute le processus d'authentification. Effectue une vérification nulle de l'entrée utilisateur, émet un UsernamePasswordAuthenticationToken en fonction des informations d'entrée et délègue l'autorisation d'authentification au gestionnaire.
UsernamePasswordAuthenticationToken Un objet de données qui a une valeur d'entrée qui hérite de AbstractAuthenticationToken et un paramètre de champ qui est utilisé pour le jugement d'authentification. Chaque fournisseur reçoit cet objet et détermine s'il peut être authentifié à partir des paramètres de champ.
AuthenticationManager L'interface org.springframework.security.authentication.AuthenticationManager. Une seule méthode est définie pour cette interface.
AuthenticationManager.java
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
La classe d'implémentation par défaut est org.springframework.security.authentication.ProviderManager.
ProviderManager a un tableau de AuthenticationProviders qui jugent réellement la correspondance de mot de passe, etc., et appelle la méthode d'authentification de chaque fournisseur pour effectuer un jugement d'authentification.
AuthenticationProvider C'est une classe qui fait en fait un jugement d'authentification (par exemple, correspondance de mot de passe, etc.). Comme mentionné ci-dessus, plusieurs fournisseurs peuvent être enregistrés.
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider());
auth.authenticationProvider(authProvider2());
}
public AuthenticationProvider authProvider() {
return new AbstractUserDetailsAuthenticationProvider() {
@Override
protected void additionalAuthenticationChecks(UserDetails userDetails,
UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
//
}
@Override
protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication)
throws AuthenticationException {
//Le processus de création d'un utilisateur spécifique que vous souhaitez utiliser pour la connexion
return user;
}
};
}
Il peut ne pas être utilisé très souvent, mais si vous obligez le fournisseur à renvoyer un utilisateur qui hérite de UserDetails, Cela peut également être comme une authentification en mémoire.
Pour enregistrer un fournisseur, ajoutez simplement une annotation de bean sous la classe de configuration qui hérite de WebSecurityConfigurerAdapter.
@Bean
public AuthenticationProvider authProvider() {
return new CustomAuthenticationProvider(passwordEncoder, authenticationService);
}
Les informations utilisateur dans la base de données sont acquises dans la méthode retrieveUser du fournisseur, et l'authentification est jugée en confirmant la correspondance du mot de passe.
C'est facile, mais c'est un résumé. En regardant l'implémentation interne, c'est intéressant car il existe des contre-mesures d'attaque de synchronisation contre le hachage de mot de passe.
Vous pouvez consulter cet article pour un résumé de Spring Security dans son ensemble. Note de base sur l'utilisation de Spring Security / mécanisme
Recommended Posts