Programmatique, l'utilisation de Ressort de Sécurité
Je suis en utilisant Wicket avec le Guichet Auth Projet pour ma couche de présentation et j'ai donc intégré avec Ressort de Sécurité. C'est la méthode qui est appelée par le Guichet pour l'authentification pour moi:
@Override
public boolean authenticate(String username, String password) {
try {
Authentication request = new UsernamePasswordAuthenticationToken(
username, password);
Authentication result = authenticationManager.authenticate(request);
SecurityContextHolder.getContext().setAuthentication(result);
} catch (AuthenticationException e) {
return false;
}
return true;
}
Le contenu (à l'intérieur ) de mon Ressort de Sécurité XML de configuration sont:
<http path-type="regex">
<form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
<password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>
La section 2.3.6. Session Attaque De Fixation De La Protection De L' de la documentation de référence dit:
Fixation de Session attaques sont un risque potentiel où il est possible
pour un attaquant malveillant afin de créer un
session en accédant à un site, puis
persuader un autre utilisateur de se connecter avec
de la même session (par l'envoi d'un
le lien contenant l'identifiant de session
comme un paramètre, par exemple). Printemps
De sécurité protège contre cette
automatiquement par la création d'une nouvelle
session lorsqu'un utilisateur se connecte. Si vous
n'avez pas besoin de cette protection, ou il
les conflits avec une autre disposition,
vous pouvez contrôler le comportement à l'aide de
la session de fixation et de protection de l'
attribut , qui a trois
options:
- migrateSession - crée une nouvelle session, une copie de l'existant
les attributs de session pour la nouvelle session. C'est la valeur par défaut.- aucun - Ne pas faire n'importe quoi. La session d'origine seront conservés.
- newSession - Créer une nouvelle session "propre", sans copier les
session existante de données.
L'authentification fonctionne, mais j'ai que je suis assez nouveau dans le Printemps de Sécurité, j'ai quelques questions auxquelles j'ai besoin de réponses trop:
- Normalement pour la connexion, je ne posterais les informations d'authentification pour
j_spring_security_check
et laissez Printemps de Sécurité effectuer le code d'authentification. Je voudrais avoir la protection contre la fixation de session attaques, je me les procurer quand j'exécute des programmes de connexion comme je le fais? Et si non, qu'aurais-je à faire pour l'obtenir? - Comment dois-je effectuer programmatique de déconnexion?
- Que je vais utiliser programmatique de connexion et de déconnexion, comment puis-je désactiver le Printemps de l'interception de ces URL?
Mise à jour:
Pour la session attaque de fixation de la protection, il me semble que j'ai besoin d'appeler la méthode dans le SessionUtils classe avec la signature startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)
.
Comment puis-je obtenir le SessionRegistry exemple, j'ai besoin de passer? Je ne peux pas trouver un moyen de créer un alias ID pour elle, ou comment faire pour obtenir l'ID ou le nom.
- Bounty est donnée à la première publication d'une réponse pour les trois questions ci-dessus
- Hey Kent - j'ai répondu aux questions et de vous laisser le bounty expiré - pourquoi?
- Désolé, j'ai eu quelques questions personnelles, qui m'a gardé de se connecter.
Vous devez vous connecter pour publier un commentaire.
C'est peut-être pas une réponse complète à vos questions, mais peut-être cela peut vous aider.
Le code appelé lorsque vous n'utilisez PAS programmatique de la connexion, mais un standard se trouve ici:
org.springframework.security.ui.webapp.AuthenticationProcessingFilter
Je suppose que vous avez été inspiré par cette dans votre code. Il semble tout à fait similaire.
De même, le code exécuté lorsque vous accédez à la
/j_spring_security_logout
dans l'approche standard, peut être trouvée ici:org.springframework.security.ui.logout.LogoutFilter
La LogoutFilter appels de plusieurs gestionnaires. Le gestionnaire que nous utilisons est appelé:
org.springframework.security.ui.logout.SecurityContextLogoutHandler
, de sorte que l'on pourrait appeler le même code dans votre démarche.Vous sera en effet ouvert à la session d'fixations attaques. Pour remédier à cela, vous pourrait de nouveau être "inspiré" par le Printemps de code. Pour créer une nouvelle session, vous aurez évidemment besoin d'un accès à la httpsession sorte que vous pouvez avoir à faire quelques refontes.
Si vous voyez la méthode
SessionUtils
.startNewSessionIfRequired
.Cela va migrer l'authentification à une nouvelle session. Vous pourriez être en mesure d'appeler cette méthode directement ou bien juste refactoriser le code un peu.
Comme pour la programmation déconnexion, vous ne pouvez pas aller trop loin de la vérité en appelant simplement
session.invalidate()
lorsque vous devez vous connecter à la personne. Cela va faire tout le nécessaire d'un point de vue sécurité, mais garder à l'esprit que vous pourriez avoir besoin pour le nettoyage de certaines choses sur la session. Si vous avez un très compliqué de filtres etc. et vous devez vous assurer que l'utilisateur est connecté pour le reste de la demande puis vous pouvez ajouter:Que pour l'interception de l'url vous pourriez tout simplement quelque chose de inutilisés et l'ignorer! Je ne suis pas sûr si vous pouvez désactiver l'interception dans la configuration si vous voulez vraiment supprimer puis un coup d'oeil à la
AuthenticationProcessingFilter
- vous pouvez personnaliser cette. Si vous faites cela, alors vous aurez à configurer manuellement le printemps xml de sécurité et de ne pas utiliser les espaces de noms. Il n'est pas trop dur, par contre - coup à certains anciens de la documentation et vous allez voir comment faire cela.Espérons que cette aide!
1) Programmatiques Déconnexion
2) Dites-le Printemps de Sécurité de ne PAS intercepter certaines Url, ce genre d'dépend de la façon dont votre url de l'application de l'espace de configuration. Si toutes vos pages (à l'exception de /logIn et /déconnexion) a vécu à la contexte /myApp alors vous pourriez faire ceci:
J'ai eu un problème avec programmatique de connexion. J'ai appelé tous les
authenticationManager.authenticate(...)
etSecurityContextHolder.getContext().setAuthentication(...)
méthodes, mais a eu quelques problèmes avec la Session. J'ai dû ajouter les lignes suivantes pour gérer correctement la session:Ce n'était pas clair à partir de l'exemple de code affiché ci-dessus. Pour plus de regarder http://forum.springsource.org/showthread.php?t=69761
Faire programmatique de déconnexion, il est également possible de jeter un
org.springframework.security.core.AuthenticationException
. Par exemple,SessionAuthenticationException
. Dans ce casExceptionTranslationFilter
lancer de déconnexion.Vous pouvez essayer ce