2012-06-07 11 views
5

¿SpringSecurity tiene alguna capacidad incorporada para ignorar el letter-case del nombre de usuario? Por ejemplo, si el nombre de usuario es "student001", entonces aceptará "Student001" y "stUdent001".Ignorar el caso del nombre de usuario en SpringSecurity

La razón por la que necesito esto es porque nuestro sistema usa los correos electrónicos como nombres de usuario. Por supuesto, podría hacerlo ampliando la clase DAOAuthenticationProvider, pero me pregunto si existe alguna opción incorporada para este problema.

Respuesta

6

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

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

+0

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

3

Creo que cualquier proveedor de autenticación aprovecha las interfaces UserDetails y UserDetailsService.

Cuando se da una implementación de

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

para la aplicación personalizada específica UserDetailsService, podemos ignorar el caso de username y proporcionar la UserDetails a la primavera-seguridad para proceder con otra autenticación/autorización.

PERO, si resorte proporcionado org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl se utiliza como UserDetailsService se carga los DetallesUsuario de user mesa con condición "where username=?". Entonces es sensible a mayúsculas y minúsculas.

1

gutch es parcialmente correcto. Permite al usuario con JdbcDaoImpl hacer una verificación insensible a mayúsculas y minúsculas con la tabla de usuarios. Pero requerirá que la consulta de tabla de Autoridades también deba ser modificada.

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