2012-06-07 5 views
5

SpringSecurity에는 username의 대소 문자를 무시할 수있는 내장 기능이 있습니까? 예를 들어, 사용자 이름이 "student001"이면 "stUdent001"뿐만 아니라 "Student001"도 승인합니다.SpringSecurity에서 사용자 이름의 대소 문자를 무시합니다.

내가 필요한 이유는 Google 시스템에서 사용자 이름으로 이메일을 사용하기 때문입니다. 물론 DAOAuthenticationProvider 클래스를 확장하여이 작업을 수행 할 수는 있지만이 문제에 대한 기본 제공 옵션이 있는지 궁금합니다.

답변

6

DaoAuthenticationProvider을 사용하는 경우 JdbcDaoImpl을 사용하고 있는데 JDBC 데이터베이스에서 사용자를로드한다고 가정합니다.

그렇다면 JdbcDaoImpl이 수동으로 직접 빈을 작성하여 사용자를 찾는 데 사용하는 SQL 쿼리를 무시할 수 있습니다. 스프링 시큐리티가 사용하는 기본 쿼리는 다음과 같습니다

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

이어 [http://static.springsource.org/spring-security/site/docs/3.1.x/reference/appendix-schema.html 같이, 열은 자명 ** IGNORECASE로 만들어 :'username varchar_ignorecase (50) not null primary key' – BenC

+0

해당 페이지는 HSQLDB에 대한 SQL 문을 문서화합니다. 다른 데이터베이스는'varchar_ignorecase'를 지원할 수도 있고 지원하지 않을 수도 있습니다 ... 예를 들어, 지원하지 않는 PostgreSQL을 사용합니다. PostgreSQL에는 비슷한 기능을하는 추가 기능'citext' 모듈이 있지만 이전 버전에서는 기본적으로 설치되지 않으므로 쿼리에'lower()'를 추가하는 것이 더 쉬운 해결책입니다. – gutch

3

모든 인증 공급자는 UserDetails 및 UserDetailsService 인터페이스를 이용합니다.

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

의 구현 맞춤 주문형 UserDetailsService 주어진 경우, 우리는 username 경우를 무시하고 상기 인증 /인가 진행할 스프링 보안에 UserDetails을 제공 할 수있다. UserDetailsService 그것을 조건으로 "where username=?"user 테이블에서로드 된 UserDetails 바와 같이 스프링 org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl를 한 경우

하지만, 사용된다. 그래서 대소 문자를 구분합니다.

1

gutch

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

당신은 경우 무시하도록 SQL 하위 기능을 사용할 수 있습니다 부분적으로 맞습니다. JdbcDaoImpl을 사용하면 사용자 테이블에서 대소 문자를 구분하지 않고 검사 할 수 있습니다. 그러나 기관 테이블 쿼리를 변경해야 할 수도 있습니다.

<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> 
관련 문제