SpringSecurityには、ユーザー名の大文字と小文字を無視する機能が組み込まれていますか?たとえば、ユーザー名が「student001」の場合、「stUdent001」だけでなく「Student001」も受け入れます。
これが必要な理由は、システムが電子メールをユーザー名として使用するためです。もちろん、DAOAuthenticationProviderクラスを拡張することでこれを行うことができますが、この問題に組み込みのオプションがあるかどうか疑問に思います。
SpringSecurityには、ユーザー名の大文字と小文字を無視する機能が組み込まれていますか?たとえば、ユーザー名が「student001」の場合、「stUdent001」だけでなく「Student001」も受け入れます。
これが必要な理由は、システムが電子メールをユーザー名として使用するためです。もちろん、DAOAuthenticationProviderクラスを拡張することでこれを行うことができますが、この問題に組み込みのオプションがあるかどうか疑問に思います。
を使用している場合は、JDBC データベースからユーザーをロードする をDaoAuthenticationProvider
使用していると思います。JdbcDaoImpl
その場合は、JdbcDaoImpl
自分で Bean を手動で作成することにより、ユーザーの検索に使用する SQL クエリをオーバーライドできます。Spring Security が使用するデフォルトのクエリは次のとおりです。
select username,password,enabled from users where username = ?
大文字と小文字を無視するには、SQL の下位関数を使用できます。
select username,password,enabled from users where lower(username) = lower(?)
適切な Spring Security XML 構成は次のとおりです。
<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>
どの認証プロバイダーも UserDetails および UserDetailsService インターフェースを利用していると思います。
の実装時
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
カスタムアプリケーション固有 UserDetailsService
のusername
UserDetails
ただし、提供されたスプリングorg.springframework.security.core.userdetails.jdbc.JdbcDaoImpl
が使用され
ている場合は、テーブルUserDetailsService
から userdetails を condition でロードします。したがって、大文字と小文字が区別されます。user
"where username=?"
ガッチは部分的に正しいです。これにより、JdbcDaoImpl を持つユーザーは、ユーザー テーブルで大文字と小文字を区別しないチェックを実行できます。ただし、Authorities テーブル クエリも変更する必要があります。
<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>