2009-01-15 8 views
21

Je n'arrive pas à trouver exactement ce que je dois implémenter pour utiliser une méthode d'authentification personnalisée avec mon application Web Spring Security. J'ai une application Grails avec le plugin Spring Security qui utilise actuellement l'authentification utilisateur/mot de passe standard avec un formulaire de navigateur. Cela fonctionne correctement.Création d'une authentification personnalisée avec Acegi/Spring Security

Je dois mettre en place un mécanisme à côté de celui qui implémente un type d'authentification MAC. Si la requête HTTP contient plusieurs paramètres (par exemple un identifiant d'utilisateur, un horodatage, une signature, etc.), je dois prendre ces paramètres, effectuer des hachages et des comparaisons de signature/d'horodatage, puis authentifier l'utilisateur.

Je ne suis pas sûr à 100% par où commencer. Quelles classes de sécurité Spring dois-je étendre/implémenter? J'ai lu le Reference Documentation et ai une bonne compréhension des concepts, mais je ne suis pas vraiment sûr si j'ai besoin d'un filtre ou d'un fournisseur ou d'un gestionnaire, ou où/comment créer exactement des objets Authentication. J'ai essayé d'étendre AbstractProcessingFilter et/ou de mettre en œuvre AuthenticationProvider, mais je me fais juste comprendre comment je les fais tous bien jouer.

Répondre

23
  1. Mettre en oeuvre une coutume AuthenticationProvider qui obtient toutes vos informations d'authentification du Authentication: getCredentials(), getDetails() et getPrincipal().

    Tie dans votre mécanisme d'authentification de sécurité Spring en utilisant l'extrait de configuration suivante:

<bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider"> 
    <security:custom-authentication-provider /> 
</bean> 
  1. Cette étape est facultative, si vous pouvez trouver un convenable à partir d'implémentations standard. Dans le cas contraire, mettre en œuvre une classe étendant l'interface Authentication sur laquelle vous pouvez mettre vos paramètres d'authentification:

    (e.g. a user identifier, timestamp, signature, etc.) 
    
  2. Prolonger une coutume SpringSecurityFilter qui lie les deux classes ensemble ci-dessus. Par exemple, le filtre peut obtenir le AuthenticationManager et appeler authenticate() en utilisant votre implémentation de Authentication comme entrée.

    Vous pouvez étendre AbstractAuthenticationProcessingFilter en tant que début.

    Vous pouvez référencer UsernamePasswordAuthenticationFilter qui s'étend AbstractAuthenticationProcessingFilter. UsernamePasswordAuthenticationFilter implémente l'authentification par nom d'utilisateur/mot de passe standard. Configurez votre Spring Security pour ajouter ou remplacer la norme AUTHENTICATION_PROCESSING_FILTER. Pour les commandes de filtre ressort de sécurité, voir http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#filter-stack

    Voici un extrait de configuration pour savoir comment le remplacer par votre implémentation:

<beans:bean id="myFilter" class="com.example.MyAuthenticationFilter"> 
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/> 
</beans:bean> 
+0

Je pense que vous devez utiliser la position PRE_AUTH_FILTER au lieu de AUTHENTICATION_PROCESSING_FILTER. Vous pouvez également consulter ce didacticiel pour une implémentation de l'authentification dans Google App Engine: http://blog.springsource.com/2010/08/02/spring-security-in-google-app-engine/ – Tal

1

Voici un exemple de fichier de configuration securityContext.xml à l'aide autenticationFilter personnalisée (extension AUTHENTICATION_PROCESSING_FILTER) et authenticationProvider. Les données d'authentification de l'utilisateur sont fournies par une connexion jdbc. La configuration est pour Spring Security 2.0.x

<?xml version="1.0" encoding="UTF-8"?> 

<sec:global-method-security /> 

<sec:http auto-config="false" realm="CUSTOM" create-session="always" servlet-api-provision="true" 
    entry-point-ref="authenticationProcessingFilterEntryPoint" access-denied-page="/notauthorized.xhtml" 
    session-fixation-protection="migrateSession"> 
    <sec:port-mappings> 
    <sec:port-mapping http="80" https="443" /> 
    </sec:port-mappings> 

    <sec:anonymous granted-authority="ROLE_ANONYMOUS" username="Anonymous" /> 
    <sec:intercept-url pattern="/**" access="ROLE_ANONYMOUS, ROLE_USER" /> 

    <sec:logout logout-url="/logoff" logout-success-url="/home.xhtml" invalidate-session="false" /> 

</sec:http> 

<bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint"> 
    <property name="loginFormUrl" value="/login.xhtml" /> 
    <property name="forceHttps" value="false" /> 
</bean> 

<bean id="authenticationProcessingFilter" class="mypackage.CustomAuthenticationProcessingFilter"> 
    <sec:custom-filter position="AUTHENTICATION_PROCESSING_FILTER" /> 
    <property name="defaultTargetUrl" value="/" /> 
    <property name="filterProcessesUrl" value="/logon" /> 
    <property name="authenticationFailureUrl" value="/loginError.xhtml" /> 
    <property name="alwaysUseDefaultTargetUrl" value="false" /> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

<jee:jndi-lookup id="securityDataSource" jndi-name="jdbc/DB_DS" /> 

<bean id="myUserDetailsService" class="mypackage.CustomJdbcDaoImpl"> 
    <property name="dataSource" ref="securityDataSource" /> 
    <property name="rolePrefix" value="ROLE_" /> 
</bean> 

<bean id="apcAuthenticationProvider" class="mypackage.CustomDaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="myUserDetailsService" /> 
    <sec:custom-authentication-provider /> 
</bean> 

<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager"> 
    <property name="providers"> 
    <list> 
    <ref local="apcAuthenticationProvider" /> 
    </list> 
    </property> 
</bean> 

</beans> 
1

J'ai récemment mis en place un exemple d'application qui fait l'authentification personnalisé avec Spring Security 3. Le code source est here. Plus de détails sont en this blog post.