2010-09-09 7 views
2

J'ai un AuthenticationManager avec plusieurs AuthenticationProviders. Cela fonctionne très bien, le premier AP qui peut auth² Authentification authentifie l'utilisateur et si personne ne le peut, l'utilisateur est refusé.Spring Security 3: Est-il possible de voir quel AuthenticationProvider a authentifié une session?

Maintenant, j'ai un cas un peu plus spécial, et j'ai besoin de savoir quel AuthenticationProvider authentifié un utilisateur qui a été authentifié avec succès. Je n'arrive pas à trouver un moyen de le faire de manière stable et fiable.

Je peux imaginer des hacks créatifs (par exemple des instances entrelacées d'un AuthenticationProvider qui ne parvient pas à s'authentifier, mais qui peuvent aider à déterminer quel était le dernier AuthenticationProvider vu), mais ce n'est vraiment pas le cas. Existe-t-il un moyen officiel de le faire?

Répondre

2

Je n'ai pas essayé, mais vous pourriez être en mesure de brancher sur les événements qui sont déclenchés sur authentifications réussies et obtenir les informations que vous recherchez

AuthenticationSuccessEvent: événement d'application qui indique une authentification réussie. InteractiveAuthenticationSuccessEvent: Indique qu'une authentification interactive a réussi.

http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/authentication/event/package-summary.html

InteractiveAuthenticationSuccessEvent, a une property qui vous indique la classe qui a déclenché l'événement

+0

Cela m'amènera la plupart du temps. Je peux cependant avoir plusieurs fournisseurs d'authentification de la même classe (par exemple Jdbc ... contre un certain nombre de DS différents). Puisque cela devrait juste être configurable, je suppose que je ne peux pas simplement les sous-classer sans réellement modifier quoi que ce soit, donc je vais devoir contourner cela ou utiliser cglib et la sous-classe dynamiquement. C'est vraiment un bon début, merci! –

0

Pourquoi ne pas simplement stocker cette information ainsi que les trucs de UserDetails dans la session en cours?

+0

Eh bien, l'AuthProvider qui a authentifié l'utilisateur devrait l'écrire dans la session à ce stade, et je n'ai pas écrit ceux-ci. –

+0

Ne devrait pas être difficile de les étendre (yay programmation OO!) Et ajouter cette fonctionnalité simple. – Gandalf