Création d'une authentification personnalisée avec Acegi / Spring Security

StackOverflow https://stackoverflow.com/questions/448204

  •  19-08-2019
  •  | 
  •  

Question

Je ne parviens pas à découvrir exactement ce que je dois implémenter pour utiliser une méthode d'authentification personnalisée avec mon application Web à l'aide de 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.

Je dois également implémenter un mécanisme qui implémente un type d'authentification MAC . Si la demande HTTP contient plusieurs paramètres (par exemple, un identifiant d'utilisateur, un horodatage, une signature, etc.), je dois prendre ces paramètres, effectuer des comparaisons de hachage et signature / horodatage, puis authentifier l'utilisateur.

Je ne suis pas sûr à 100% de savoir par où commencer. Quelles classes Spring Security dois-je étendre / implémenter? J'ai lu la Documentation de référence et j'ai une bonne compréhension des concepts, mais je ne suis pas vraiment savoir si j'ai besoin d'un filtre, d'un fournisseur ou d'un gestionnaire, ou où / comment créer Authentification objets. J'ai déconné d'essayer d'étendre AbstractProcessingFilter et / ou implémenter AuthenticationProvider , mais je commence à peine à comprendre comment je les fais tous bien jouer.

Était-ce utile?

La solution

  1. Implémentez un AuthenticationProvider personnalisé, qui récupère toutes vos informations d'authentification à partir de Authentification : getCredentials () , getDetails ( ) et getPrincipal () .

    Liez-le à votre mécanisme d'authentification Spring Security à l'aide de l'extrait de configuration suivant:

<bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider">
    <security:custom-authentication-provider />
</bean>
  1. Cette étape est facultative, si vous pouvez en trouver une appropriée parmi les implémentations standard. Sinon, implémentez une classe étendant l'interface Authentication sur laquelle vous pouvez placer vos paramètres d'authentification:

    (e.g. a user identifier, timestamp, signature, etc.)
    
  2. Étendez un SpringSecurityFilter personnalisé qui lie les deux classes ci-dessus. Par exemple, le filtre peut obtenir le AuthenticationManager et appeler authenticate () en utilisant votre implémentation de Authentication en tant qu'entrée.

    Vous pouvez étendre AbstractAuthenticationProcessingFilter au début.

    Vous pouvez référencer UsernamePasswordAuthenticationFilter qui étend AbstractAuthenticationProcessingFilter . UsernamePasswordAuthenticationFilter implémente l'authentification standard Nom d'utilisateur / Mot de passe.

  3. Configurez Spring Security pour ajouter ou remplacer le AUTHENTICATION_PROCESSING_FILTER standard. Pour les commandes de filtres de sécurité Spring, consultez http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#filter-stack

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

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

Autres conseils

J'ai récemment mis en place un exemple d'application qui effectue l'authentification personnalisée avec Spring Security 3. Le code source est ici . Plus de détails sont dans ce billet de blog .

Voici un exemple de fichier de configuration securityContext.xml utilisant autenticationFilter personnalisé (extension AUTHENTICATION_PROCESSING_FILTER) et authenticationProvider. Les données d'authentification de l'utilisateur sont fournies par la connexion jdbc. La configuration concerne 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top