2012-06-07 1 views
5

SpringSecurity ha una capacità incorporata di ignorare il caso letter del nome utente? Ad esempio, se il nome utente è "student001", accetterà "Student001" e "stUdent001".Ignora il caso del nome utente in SpringSecurity

Il motivo per cui ho bisogno è che il nostro sistema utilizzi le e-mail come nomi utente. Ovviamente sarei in grado di farlo estendendo la classe DAOAuthenticationProvider, ma mi chiedo solo se esiste qualche opzione built-in per questo problema?

risposta

6

Se si utilizza il DaoAuthenticationProvider, presumo che si stia utilizzando lo JdbcDaoImpl, che carica gli utenti da un database JDBC.

In tal caso, è possibile sovrascrivere la query SQL che JdbcDaoImpl utilizza per cercare gli utenti creando manualmente il bean. La query di default che utilizza Primavera di sicurezza è:

select username,password,enabled from users where username = ? 

È possibile utilizzare la funzione SQL inferiore di ignorare caso:

select username,password,enabled from users where lower(username) = lower(?) 

La configurazione XML Primavera di sicurezza appropriata è:

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

<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="caseInsensitiveUserDetailsService"/> 
</bean> 

<bean id="caseInsensitiveUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> 
    <property name="usersByUsernameQuery" value="select username, password, enabled from users where lower(username) = lower(?)" /> 
</bean> 
+0

In [http://static.springsource.org/spring-security/site/docs/3.1.x/reference/appendix-schema.html], la colonna nome utente viene creato con ** ** ignorecase : 'username varchar_ignorecase (50) not null chiave primaria' – BenC

+0

Tale pagina documenta le istruzioni SQL per HSQLDB. Altri database possono o non possono supportare 'varchar_ignorecase' ... ad esempio utilizzo PostgreSQL che non lo supporta. PostgreSQL ha un modulo aggiuntivo 'citext' che fa qualcosa di simile, ma non è installato di default nelle versioni precedenti, quindi aggiungere' lower() 'alla query è una soluzione più semplice. – gutch

3

Credo che qualsiasi provider di autenticazione utilizzi le interfacce UserDetails e UserDetailsService.

Quando un'implementazione di

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

è dato per un'applicazione personalizzata specifica UserDetailsService, possiamo ignorare il caso di username e fornire il UserDetails alla primavera-sicurezza per procedere con ulteriori autenticazione/autorizzazione.

MA, se disponibile molla org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl viene utilizzato come UserDetailsService caricherà le UserDetails da tavolo con user condizione "where username=?". Quindi è case-sensitive.

1

gutch è parzialmente a destra. Permette all'utente con JdbcDaoImpl non verifica caso-insensibile con tabella utente. Ma è necessario che anche la query della tabella delle autorità debba essere modificata.

<bean id="caseInsensitiveUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> 
    <property name="usersByUsernameQuery" value="select username, password, enabled from users where lower(username) = lower(?)" /> 
    <property name="authoritiesByUsernameQuery" value="select username,authority " + 
     "from authorities where lower(username) = lower(?)" /> 
</bean>