Domanda

Ho difficoltà a scoprire esattamente cosa devo implementare per utilizzare un metodo di autenticazione personalizzato con la mia applicazione Web utilizzando Spring Security. Ho un'applicazione Grails con il plug-in Spring Security che attualmente utilizza l'autenticazione utente / password standard con un modulo browser. Questo funziona correttamente.

Devo implementare un meccanismo a fianco di questo che implementa un tipo di MAC . Se la richiesta HTTP contiene diversi parametri (ad es. Un identificativo utente, data / ora, firma, ecc.) Devo prendere quei parametri, eseguire alcuni confronti di hashing e firma / data / ora, quindi autenticare l'utente.

Non sono sicuro al 100% da dove cominciare. Di quali classi di Spring Security ho bisogno per estendere / implementare? Ho letto la Documentazione di riferimento e ho una buona comprensione dei concetti, ma non lo sono davvero certo se ho bisogno di un filtro o provider o gestore, o dove / come creare esattamente Autenticazione oggetti. Sono andato in giro cercando di estendere AbstractProcessingFilter e / o implementare AuthenticationProvider , ma mi sorprendo a capire come faccio a farli giocare tutti bene.

È stato utile?

Soluzione

  1. Implementa un AuthenticationProvider personalizzato che ottiene tutte le informazioni di autenticazione da Authentication : getCredentials () , getDetails ( ) e getPrincipal () .

    Collegalo al tuo meccanismo di autenticazione Spring Security usando il seguente frammento di configurazione:

<bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider">
    <security:custom-authentication-provider />
</bean>
  1. Questo passaggio è facoltativo, se ne trovi uno adatto dalle implementazioni standard. In caso contrario, implementa una classe che estende l'interfaccia Authentication sulla quale puoi inserire i tuoi parametri di autenticazione:

    (e.g. a user identifier, timestamp, signature, etc.)
    
  2. Estendi un SpringSecurityFilter personalizzato che unisce le due classi precedenti. Ad esempio, il filtro potrebbe ottenere AuthenticationManager e chiamare authenticate () utilizzando l'implementazione di Authentication come input.

    Puoi estendere AbstractAuthenticationProcessingFilter come inizio.

    Puoi fare riferimento a UsernamePasswordAuthenticationFilter che estende AbstractAuthenticationProcessingFilter . UsernamePasswordAuthenticationFilter implementa l'autenticazione standard Username / Password.

  3. Configura Spring Security per aggiungere o sostituire il AUTHENTICATION_PROCESSING_FILTER standard. Per gli ordini di Spring Security Filter, vedere http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#filter-stack

    Ecco uno snippet di configurazione su come sostituirlo con la tua implementazione:

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

Altri suggerimenti

Di recente ho installato un'applicazione di esempio che esegue l'autenticazione personalizzata con Spring Security 3. Il codice sorgente è qui . Maggiori dettagli sono disponibili in questo post sul blog .

Ecco un esempio del file di configurazione securityContext.xml che utilizza il filtro autentication personalizzato (che estende AUTHENTICATION_PROCESSING_FILTER) e authenticationProvider. I dati di autenticazione dell'utente sono forniti dalla connessione jdbc. La configurazione è per 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top