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