2012-06-07 58 views
5

SpringSecurityには、usernameの大文字小文字を無視する組み込みの機能がありますか?たとえば、ユーザー名が "student001"の場合、 "student001"と同様に "Student001"も受け入れられます。SpringSecurityのユーザー名の大文字小文字を無視する

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

答えて

6

DaoAuthenticationProviderを使用している場合は、JdbcDaoImplを使用していると想定します。この場合、JDBCデータベースからユーザーが読み込まれます。

もしそうなら、JdbcDaoImplが使用するSQLクエリを、手動でBeanを手動で作成して検索することができます。春のセキュリティが使用するデフォルトのクエリは次のとおりです。

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

あなたはケースを無視するSQL lower関数を使用することができます。

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

適切な春のセキュリティ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> 
+0

、ユーザ名の欄には** IGNORECASEで作成されます** : 'username varchar_ignorecase(50)not null primary key' – BenC

+0

このページには、HSQLDBのSQL文が記述されています。他のデータベースは 'varchar_ignorecase'をサポートしているかもしれないし、サポートしていないかもしれません...例えば、私はそれをサポートしていないPostgreSQLを使っています。 PostgreSQLには同様のことをするアドオン 'citext'モジュールがありますが、古いバージョンではデフォルトではインストールされないので、クエリに' lower() 'を追加する方が簡単です。 – gutch

3

すべての認証プロバイダは、UserDetailsインターフェイスとUserDetailsS​​erviceインターフェイスを利用すると考えています。

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

の実装がカスタムアプリケーション固有のUserDetailsServiceのために与えられたとき、私たちはusernameのケースを無視し、さらに認証/認可を続行するために、スプリング・セキュリティにUserDetailsを提供することができます。

BUT、ばねorg.springframework.security.core.userdetails.jdbc.JdbcDaoImplUserDetailsServiceとして使用され提供される場合には、条件"where username=?"userテーブルからuserdetailsをロードします。したがって、大文字と小文字が区別されます。

1

gutch部分的に正しいです。 JdbcDaoImplを使用すると、ユーザーテーブルで大文字と小文字を区別しないチェックが可能になります。しかし、権限テーブルのクエリも変更する必要があります必要があります。 [http://static.springsource.org/spring-security/site/docs/3.1.x/reference/appendix-schema.html]で

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