2009-11-18 2 views
0

Mon système comporte 2 sous-systèmes. Chaque sous-système a un ensemble d'utilisateurs différent. Chaque utilisateur a un champ supplémentaire "SystemName" qui peut être utilisé pour savoir à quel système appartient cet utilisateur.Authentification personnalisée

Dans les formulaires de connexion (formulaire 1 pour chaque sous-système) j'ai ajouté un champ caché spécifiant le type du formulaire (contenant la valeur SystemName).

En général, le contrôle est assez simple:

if (user.systemName == params.systemName) { 
    proceed with regular login 
} else { 
    throw standard login error 
} 

J'ai essayé de mettre ce chèque à mon DaoAuthenticationProvider personnalisé, mais il n'a pas accès à « params.systemName ».

Où puis-je mettre ce code pour que Acegi authentifie mes utilisateurs avec cette vérification?

Merci d'avance.

Répondre

1

Voici comment je l'ai fait en Java. Étendre WebAuthenticationDetails:

import javax.servlet.http.HttpServletRequest; 
import org.acegisecurity.ui.WebAuthenticationDetails; 

public class SystemNameWebAuthenticationDetails extends WebAuthenticationDetails { 

    public SystemNameWebAuthenticationDetails() { 
     super(); 
    } 

    public SystemNameWebAuthenticationDetails(HttpServletRequest request) { 
     super(request); 
     this.systemName = request.getParameter("systemName"); 
    } 

    public String getSystemName() { 
     return systemName; 
    } 

    private String systemName; 
} 

Set dans le filtre d'authentification:

<bean id="authenticationProcessingFilter" 
     class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> 
     ... 
     <property name="authenticationDetailsSource"> 
     <bean class="org.acegisecurity.ui.AuthenticationDetailsSourceImpl"> 
      <property name="clazz" value="SystemNameWebAuthenticationDetails"/> 
     </bean> 
     </property> 
</bean> 

Plus tard, vous pouvez accéder à cette propriété dans le processus d'authentification demandant les détails de l'objet d'authentification. Ou ce faisant:

SecurityContextHolder.getContext().getAuthentication().getDetails()