Personnalisé WebSecurityConfigurerAdapter
J'ai ce problème de mise en œuvre de connexion personnalisé d'authentification à l'aide de SpringBoot et SpringBoot de Sécurité. J'ai fait un Dépôt Bitbucket comme référence pour ce thread (dans CustomSecuringWeb branche). Avant toute chose, la plupart des commentaires ici suit la La sécurisation d'une Application Web tutoriel.
La chose est, j'étais curieux de savoir comment les données d'authentification sont maintenant à partir de la base de données au lieu de simplement les données de la mémoire (ce qui est très commun dans la production d'applications en ligne).
Tout au long du processus, j'ai fait deux tentatives (bien que les deux tentatives sont situés sur la même branche - mon mauvais pour que).
- Créé une coutume
UserDetailsService
mise en œuvre - Créé une coutume
AbstractUserDetailsAuthentictionProvider
mise en œuvre
Je ne sais pas où se situe le problème, mais lors de la vérification du journal de la console renvoie à la fois de la persistance(même le référentiel) DI sur chaque classe personnalisée où null.
La question est de savoir comment ai-je pu faire, les deux tentatives de travail. Et (peut-être) qu'un des deux tentatives est mieux que l'autre.
OriginalL'auteur Kaido Shugo | 2015-01-14
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, les deux approches sont utilisées à des fins différentes et ne sont pas interchangeables.
Cas 1:
UserDetailsService
est utilisé uniquement comme DAO pour localiser des informations de l'utilisateur par votre authentification et basé sur cette info authentifier l'utilisateur, pas d'authentification devrait être fait dans lesUserDetailsService
, juste d'accès aux données.Les spécifications de mentionner clairement. C'est ce que vous cherchez.
Case2:
AuthentictionProvider
sur l'autre main est utilisée pour offrir personnalisé méthode d'authentification, par exemple si vous voulez à la coutume de s'authentifier sur des domaines autres que les login et mot de passe, vous pouvez le faire que par la mise en œuvre deAuthentictionProvider
et la fourniture de cet objet à votreAuthenticationManagerBuilder
. Je ne pense pas que ce est ce que vous voulez faire dans votre projet. Vous êtes à la recherche pour mettre en œuvre votre authentification basée sur les utilisateurs stockées dans la base de données en utilisant le login et le mot de passe qui est par défaut.Au-dessus de Cas 1 lorsque vous avez mis en place juste
UserDetailsService
, de l'instance deAuthentictionProvider
a été créé pour vous dansAuthenticationManager
par le conteneur et il a étéDaoAuthenticationProvider
depuis que vous avez fourni UserDetailsService qui n'est rien d'autre que de DAO dans votre système qui est utilisé pour la restauration de l'utilisateur pour l'authentification.Maintenant à votre mise en œuvre,
dans votre configuration, au lieu de :
faire quelque chose comme ceci
et votre
CustomUserDetailsService
a à mettre en œuvreorg.springframework.security.core.userdetails.UserDetailsService
bien sûr, la mise en œuvre est à vous, mais vous devez être en mesure de fournir à l'utilisateur un mot de passe, et le reste des méthodes de cette interface basée sur l'extrait de l'utilisateur (Admin.class dans votre cas). Espérons que cela aide. Je n'ai pas exécuter cet exemple donc, si j'ai fait quelques fautes de frappe aller de l'avant et de se demander si quelque chose ne fonctionne pas. Je voudrais également vous débarrasser de cette "AuthentictionProvider" de votre projet si vous n'en avez pas besoin.
Ici vous avez obtenu de la documentation:http://docs.spring.io/spring-security/site/docs/4.0.0.RC1/reference/htmlsingle/#tech-userdetailsservice
Après les commentaires:
Vous pouvez définir
PasswordEncoder
dans votre méthode configure (sans trop de tracas juste à faire:Vous pouvez le faire parce que vous obtenez l'accès à
AbstractDaoAuthenticationConfigurer
retourné à partir deauth.userDetailsService(userDetailsService)
et il vous permet de configurerDaoAuthenticationProvider
, qui est votre fournisseur de choix lorsque vous choisissez d'utiliserUserDetailsService
.Vous avez raison
PasswordEncoder
est situé dansAuthenticationProvider
mais vous n'avez pas àmettre en œuvre
AuthenticationProvider
suffit d'utiliser convineince objet qui est retourné à partir deauth.userDetailsService(userDetailsService)
et de définir votre codeur de cet objet qui va passer àAuthenticationPriovider
dans votre casDaoAuthenticationProvider
qui a déjà été créée pour vous.Tout comme roadrunner mentionné dans le commentaire que vous avez rarement besoin de mettre en place votre propre
AuthenticationProvider
généralement plus de la configuration de l'authentification des ajustements peuvent être effectués avec l'utilisation deAbstractDaoAuthenticationConfigurer
qui, comme mentionné ci-dessus est renvoyé à partir deauth.userDetailsService(userDetailsService)
."Et si jamais je voulais ajouter un mot de passe de cryptage. Et si jamais je voulais faire d'autres authentification (comme vérifier si l'utilisateur est verrouillé, active, l'utilisateur est toujours connecté, etc. [à l'exclusion de hachage de mot de passe]) utilisent le AuthenticationProvider."
Pas de ce qui est fait pour vous dans le cadre de la norme mécanisme d'authentification
http://docs.spring.io/autorepo/docs/spring-security/3.2.0.RELEASE/apidocs/org/springframework/security/core/userdetails/UserDetails.html
Si vous regardez l'interface
UserDetails
vous verrez que si aucune des méthodes ci-dessus renvoie false authentification échoue.La mise en œuvre de
AuthenticationProvider
est vraiment nécessaire dans très atypique cas. Tous les trucs standard est assez bien couverts par le cadre .UserDetailsService
pour récupérer les détails de l'utilisateur à l'aide de lausername
paramètre. Et si jamais je voulais ajouter un mot de passe de cryptage. Et si jamais je voulais faire d'autres authentification (comme vérifier si l'utilisateur est verrouillé, active, l'utilisateur est toujours connecté, etc. [à l'exclusion de hachage de mot de passe]) utilisent leAuthenticationProvider
.Et si jamais je voulais avoir un mot de passe de cryptage, je vais en créer un personnalisé
PasswordEncoder
instance de l'inclure dans les deux cas, non?Pas de. Il existe de très bonnes implémentations de ces deux
AuthenticationProvider
etPsswordEncoder
interfaces déjà disponible au Printemps de Sécurité. Vous devez vous pas mettre en œuvre sur votre propre dans 99% des cas. Aussi, ce qui semble hors de portée de la question d'origine. Veuillez lire les documents référencés ou de poser une autre question.OriginalL'auteur mariubog
Dans un JDBC façon http://www.mkyong.com/spring-security/spring-security-form-login-using-database/ fondamentalement, vous devez spécifier la requête pour récupérer les utilisateurs.
Le PasswordEncoder est responsable de l'encodage/décodage des mots de passe. Le codeur peut être spécifié sur le DAO avec cette méthode: auth.jdbcAuthentication().source de données(source de données).passwordEncoder();
Mais si je voulais créer une authentification personnalisée à côté de jdbcAuthentication (c'est à dire, SessionAuthentication - vérifier si l'utilisateur est toujours connecté, etc.)?
À la suite de la principe de responsabilité unique vous ne devriez pas gérer le stockage de session dans votre
AuthenticationProvider
. Printemps de Sécurité a d'autres mécanismes de traiter avec elle, et c'est une sortie de la boîte de la fonctionnalité est activée par défaut et peut être désactivée si pas nécessaire.OriginalL'auteur sebge2
Tout d'abord, je voudrais vous encourager à lire sur Chaîne De Sécurité Des Services De Base.
Une clé dans cette situation est
AuthenticationManager
qui est responsable de décider si l'utilisateur est authentifié ou non. C'est ce que vous configurez avecAuthenticationManagerBuilder
. Principal de la mise en œuvre au Printemps estProviderManager
qui permet de définir plusieurs mécanismes d'authentification dans une seule application. L'utilisation la plus courante est le cas il y en a un, mais il est toujours géré par cette classe. Chacun de ces multiples mécanismes d'authentification est représenté par un autreAuthenticationProvider
.ProviderManager
prend une liste deAunthenticationProviders
un parcourt pour voir si l'un d'eux peut authentifier l'utilisateur.Ce que vous êtes intéressé est
DaoAuthenticationProvider
. Comme son nom l'indique, il permet d'utiliser un Objet d'Accès aux Données pour authentifier l'utilisateur. Il utilise une interface standard pour ces DAO - uneUserDetailsService
. Il y a un défaut de mise en œuvre disponibles au Printemps de Sécurité, mais généralement c'est ce que vous voulez mettre en œuvre vous-même. Tout le reste est fourni.Aussi, le bit de configuration que vous avez besoin est totalement indépendante de Printemps de Démarrage. C'est comment vous pouvez le faire en XML:
Et en Java, ce sera:
Comme par
UserDetails
mise en œuvre, généralement celui fourni par Spring Security est assez. Mais vous pouvez également mettre en place votre propre en cas de besoin.Habituellement, vous voudrez aussi un
PasswordEncoder
. Un bon, commeBCryptPasswordEncoder
:Avis que c'est un
@Bean
, de sorte que vous pouvez@Autowire
dans votreUserRepository
pour encoder les mots de passe utilisateur que vous enregistrez dans la base de données.C'est une alternative. Vous pouvez le faire en XML ou en Java. J'ai montré dans les deux sens. Vous ne faites pas les deux à la fois - l'un d'entre eux.
OriginalL'auteur Roadrunner