7

SpringSecurityには、ユーザー名の大文字と小文字を無視する機能が組み込まれていますか?たとえば、ユーザー名が「student001」の場合、「stUdent001」だけでなく「Student001」も受け入れます。

これが必要な理由は、システムが電子メールをユーザー名として使用するためです。もちろん、DAOAuthenticationProviderクラスを拡張することでこれを行うことができますが、この問題に組み込みのオプションがあるかどうか疑問に思います。

4

3 に答える 3

6

を使用している場合は、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>
于 2012-06-07T04:42:20.407 に答える
4

どの認証プロバイダーも UserDetails および UserDetailsS​​ervice インターフェースを利用していると思います。

の実装時

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

カスタムアプリケーション固有 UserDetailsServiceusernameUserDetails

ただし、提供されたスプリングorg.springframework.security.core.userdetails.jdbc.JdbcDaoImplが使用され ている場合は、テーブルUserDetailsServiceから userdetails を condition でロードします。したがって、大文字と小文字が区別されます。user"where username=?"

于 2012-06-07T04:33:20.023 に答える
1

ガッチは部分的に正しいです。これにより、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>
于 2015-05-27T00:13:10.647 に答える