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>
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
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