Si está utilizando el DaoAuthenticationProvider
, supongo que está usando el JdbcDaoImpl
con él, que carga usuarios de una base de datos JDBC.
Si es así, puede anular la consulta SQL que JdbcDaoImpl
utiliza para buscar usuarios creando manualmente el bean. La consulta predeterminada que utiliza Spring Security es:
select username,password,enabled from users where username = ?
puede utilizar la función de SQL inferior a ignorar caso:
select username,password,enabled from users where lower(username) = lower(?)
la configuración XML Spring Security apropiada es:
<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>
En [http://static.springsource.org/spring-security/site/docs/3.1.x/reference/appendix-schema.html], la columna de nombre de usuario se crea con ** ** ignorecase : 'username varchar_ignorecase (50) not null primary key' – BenC
Esa página documenta las sentencias de SQL para HSQLDB. Otras bases de datos pueden o no admitir 'varchar_ignorecase' ... por ejemplo, yo uso PostgreSQL que no lo admite. PostgreSQL tiene un módulo complemento 'citext' que hace algo similar, pero no está instalado por defecto en versiones anteriores, por lo que agregar' lower() 'a la consulta es una solución más fácil. – gutch