2012-06-07 2 views
5

Hat SpringSecurity eine eingebaute Fähigkeit, den Groß- und Kleinbuchstaben des Benutzernamens zu ignorieren? Wenn der Benutzername zum Beispiel "student001" lautet, wird sowohl "Student001" als auch "stUdent001" akzeptiert.Benutzernamen in SpringSecurity ignorieren

Der Grund, warum ich das brauche ist, dass unser System E-Mails als Benutzernamen verwendet. Natürlich könnte ich dies tun, indem ich die DAOAuthenticationProvider-Klasse erweitere, aber ich frage mich nur, ob es eine eingebaute Option für dieses Problem gibt?

Antwort

6

Wenn Sie die DaoAuthenticationProvider verwenden, dann nehme ich an, dass Sie die JdbcDaoImpl damit verwenden, die Benutzer aus einer JDBC-Datenbank lädt.

Wenn dies der Fall ist, können Sie die SQL-Abfrage überschreiben, die JdbcDaoImpl verwendet, um nach Benutzern zu suchen, indem Sie die Bean manuell erstellen. Die Standard-Abfrage, die Spring Security verwendet, ist:

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

Die entsprechende Spring Security XML-Konfiguration ist

:

<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] wird der Benutzername Spalte mit ** ignorecase erstellt ** : 'Benutzername varchar_ignorecase (50) nicht null Primärschlüssel ' – BenC

+0

Diese Seite dokumentiert die SQL-Anweisungen für HSQLDB. Andere Datenbanken können 'varchar_ignorecase' unterstützen oder nicht ... zum Beispiel benutze ich PostgreSQL, das es nicht unterstützt. PostgreSQL hat ein Add-On-Modul namens "citext", das etwas Ähnliches tut, aber es ist nicht standardmäßig in älteren Versionen installiert, so dass das Hinzufügen von 'lower()' zur Abfrage eine einfachere Lösung ist. – gutch

3

Ich glaube, jeder Authentifizierungsanbieter nutzen die BenutzerDetails und UserDetailsService-Schnittstellen.

Wenn eine Implementierung von

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

für kundenspezifische anwendungsspezifische UserDetailsService gegeben ist, können wir den Fall von username ignorieren und die UserDetails auf die Feder-Sicherheit bieten weitere Authentifizierung/Autorisierung, um fortzufahren.

Aber, wenn Feder org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl vorgesehen ist, wie UserDetailsService verwendet es werden die Userdetails von user Tabelle mit Zustands "where username=?" zu laden. Es ist also Groß-und Kleinschreibung.

1

gutch

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

Sie die SQL Senkfunktion Fall ignorieren können ist teilweise richtig. Es ermöglicht dem Benutzer mit JdbcDaoImpl die Groß-/Kleinschreibung nicht mit der Benutzertabelle zu überprüfen. Aber Sie müssen die Abfrage der Tabelle der Autorität auch geändert werden müssen.

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