Acegi Security est un framework qui peut s'utiliser conjointement avec Spring pour fournir des fonctionnalités d'authentification et d'autorisation dans des applications Java ou J2EE.
Par défaut, Acegi utilise un formulaire de connexion qui doit contenir un champ "login" et un champ "password" dont les valeurs sont transmises via des filtres se trouvant dans le framework. Il peut arriver que l'on souhaite récupérer d'autres informations du formulaire de connexion afin de les placer en session.
Supposons en effet que notre formulaire de connexion contienne une combobox alimentée par une liste de valeurs. Selon la valeur choisie par l'utilisateur, ce dernier doit être redirigé vers une page ou une autre. Lorsque l'utilisateur clique sur "Connexion", la valeur choisie est stockée dans un paramètre que l'on nommera "valeurChoisie".
Une façon simple de réaliser ce scénario est de créer une classe dérivée de la classe Acegi
AuthenticationProcessingFilter:
public class AuthenticationProcessingFilterBlump extends AuthenticationProcessingFilter {
private final static Log log = LogFactory.getLog(AuthenticationProcessingFilterBlump.class);
@Override
protected String determineTargetUrl(HttpServletRequest request) {
String valeurChoisie = request.getParameter("valeurChoisie");
if (!StringUtils.isEmpty(projectId) && StringUtils.isNumeric(valeurChoisie)) {
Integer id = Integer.decode(projectId);
log.debug("Valeur choisie => " + id);
((HttpServletRequest) request).getSession().setAttribute(Constants.VALEUR_CHOISIE, id);
if (id > 0) {
return getDefaultTargetUrl(); // retourne l'url par défaut défini dans le fichier xml Acegi
} else if (id == 0) {
return "/administration/page_admin"; // une url particulière qui peut également être externalisée dans le fichier xml Acegi
}
}
return getDefaultTargetUrl();
}
}
C'est la méthode
determineTargetUrl() qui indique à Acegi vers quelle url diriger l'utilisateur après une connexion réussie.
Il faut également modifier le fichier xml de configuration d'Acegi et remplacer
AuthenticationProcessingFilter par notre nouvelle classe:
<bean id="authenticationProcessingFilter" class="com.fha.filter.AuthenticationProcessingFilterBlump">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationFailureUrl" value="/login.jsp?error=true"/>
<property name="defaultTargetUrl" value="/"/>
<property name="filterProcessesUrl" value="/j_security_check"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>
Il est bien entendu possible de définir d'autres propriétés dans notre nouvelle classe et de les initialiser via Spring par le fichier de configuration Acegi.
J'espère que cette astuce pourra aider à customiser le fonctionnement d'Acegi dans vos applications car ce n'est pas forcément évident du premier coup avec la quantité de classes utilisées par Acegi dans sa configuration.