Sécurité de printemps authentification personnalisée-AuthenticationProvider vs UserDetailsService
autant que je puisse comprendre quand vous voulez une authentification personnalisée dans la sécurité du printemps, vous pouvez soit implémenter un ou custom UserDetailsService
.
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
//.authenticationProvider(authProvider) // option 1
.userDetailsService(userDetailsService); // option 2
}
dans Leprovider D'authentification, vous pouvez vérifier le nom d'utilisateur et le mot de passe et retourner Authentication
avec votre objet personnalisé.
public Authentication authenticate(Authentication authentication){
if (checkUsernameAndPassword(authentication)) {
CustomUserDetails userDetails = new CustomUserDetails();
//add whatever you want to the custom user details object
return new UsernamePasswordAuthenticationToken(userDetails, password, grantedAuths);
} else {
throw new BadCredentialsException("Unable to auth against third party systems");
}
}
Dans le UserDetailsService
vous obtenez seulement le nom d'utilisateur et lorsque vous retournez les données personnalisées, le framework effectue un contrôle sur le mot de passe.
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
CustomUserDetails user = new CustomUserDetails();
//add whatever you want to the custom user details object
return user;
}
Regarde comme les deux peuvent produire des résultats similaires. La question est donc quelle est la différence? Quand à l'utilisateur un vs l'autre?
3 réponses
la réponse est à l'intérieur de votre question. lorsque vous utilisez un système d'authentification différent, et que le mot de passe n'est pas fourni dans votre propre base de données/modèle de données, vous devez utiliser Leprovider D'authentification. par exemple, j'ai travaillé dans un projet où le client avait un système d'authentification centralisé (CAS), de sorte que mon système n'avait aucune idée du mot de passe, j'ai dû mettre en œuvre le fournisseur D'authentification et envoyer le mot de passe donné aux CAS, et agir selon sa réponse.
mais dans un autre système, je stockais le mot de passe dans ma base de données, donc tout ce que j'avais à faire était de mettre en œuvre le UserDetailsService et de vérifier si l'utilisateur existe dans ma base de données ou non, ressort-sécurité a dû faire le reste.
extrait de la documentation de sécurité du printemps, https://docs.spring.io/spring-security/site/docs/5.0.0.RC1/reference/htmlsingle/#overall-architecture
il y a souvent une certaine confusion au sujet de UserDetailsService. Il s'agit purement d'un OAD pour les données des utilisateurs et n'exerce aucune autre fonction que celle de fournir ces données à d'autres composantes dans le cadre. En particulier, il n'authentifie pas l'utilisateur, ce qui est fait par le Gestionnaire D'authentification. Dans de nombreux cas, il rend plus de sens à mettre en œuvre AuthenticationProvider directement si vous avez besoin d'un processus d'authentification personnalisé.
Authentifierprovider et UserDetailsService ont un but différent.
AuthenticationProvider authentifie (compare) l'utilisateur(demande) fourni nom d'utilisateur et mot de passe contre L'utilisateur du système(cela peut être n'importe quel système comme DB qui maintient la liste des utilisateurs enregistrés)
il est de la responsabilité de la mise en œuvre de UserDetailsService d'obtenir le Les détails de l'utilisateur du système qui correspondent au nom d'utilisateur fourni. Ici, il obtient juste les utilisateurs qui ont le même nom d'utilisateur et ne dit pas à l'application si l'authentification est réussie ou a échoué.
Exemple : Spring fournit ce qui suit Comme configuration par défaut pour authentifier les détails d'un utilisateur par rapport à la base de données
- Authentiationprovider-DAO Authentiticationprovider qui étend AbstractUserDetailsAuthenticationprovider qui appelle la méthode d'authentification en passant sur le nom d'utilisateur, L'objet D'authentification
- UserDetailsService-Jdbcdaipl
- Flux d'authentification
- Dooauthenticationprovider la responsabilité consiste à authentifier le nom d'utilisateur et le mot de passe obtenus sur demande auprès de L'utilisateur de la base de données.
- pour obtenir L'utilisateur de base de données correspondant, il demande UserDetailsService Implementataion Jdbcdaipl d'obtenir un objet UserDetail de la base de données avec le même nom que request username.Ici JdbcDaoImpl récupère simplement L'objet UserDetails du système.Il renverra l'utilisateur trouvé dans DB ou enverra une exception que l'utilisateur n'est pas trouvé.
- si les détails de l'utilisateur se trouvent dans la base de données, DAO AuthenticationProvider procède alors à la vérification sur demande du mot de passe utilisateur avec le mot de passe utilisateur trouvé par la base de données, sinon l'authentification échoue.
- DaoAuthenticationProvider répondra si l'utilisateur est authentifié ou non basé sur Jdbccdaimpl réponse.
jetez un oeil ici pour mieux comprendre:
AuthenticationProvider -Dao AuthenticationProvider s'étend AbstractUserDetailsAuthenticationprovider
UserDetailsService - JdbcDaoImpl
UserDetails -Utilisateur
ces deux - là sont liés mais sont intentionnellement séparés par la sécurité du ressort. Si l'entreprise a plusieurs systèmes, UserDetailsService fournira les informations spécifiques de l'utilisateur détenues par votre système particulier, même si l'authentification peut être effectuée par un tout autre système. Dans un système simple, ils peuvent être combinés. Par exemple, un appel de base de données vérifiera le nom d'utilisateur/mot de passe et récupérera tous les e-mails, ID et etc. de cet utilisateur.
selon la sécurité du ressort Référence: http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#getting-started
il y a souvent une certaine confusion au sujet de UserDetailsService. Il s'agit purement d'un OAD pour les données des utilisateurs et n'exerce aucune autre fonction que celle de fournir ces données à d'autres composantes dans le cadre. En particulier, il n'authentifie pas l'utilisateur, ce qui est fait par le Gestionnaire D'authentification. Dans de nombreux cas, il est plus logique de mettre en œuvre Leprovider D'authentification directement si vous avez besoin d'un processus d'authentification personnalisé.