2012-06-07 17 views
5

SpringSecurity có một số khả năng tích hợp để bỏ qua trường hợp chữ cái của tên người dùng không? Ví dụ: nếu tên người dùng là "student001", thì tên người dùng sẽ chấp nhận "Student001" cũng như "stUdent001".Bỏ qua trường hợp tên người dùng trong SpringSecurity

Lý do tôi cần điều này là hệ thống của chúng tôi sử dụng email làm tên người dùng. Tất nhiên tôi sẽ có thể làm điều này bằng cách mở rộng lớp DAOAuthenticationProvider, nhưng tôi tự hỏi liệu có bất kỳ tùy chọn tích hợp nào tồn tại cho vấn đề này không?

Trả lời

6

Nếu bạn đang sử dụng DaoAuthenticationProvider thì tôi cho rằng bạn đang sử dụng JdbcDaoImpl, nó sẽ tải người dùng từ cơ sở dữ liệu JDBC.

Nếu có, bạn có thể ghi đè truy vấn SQL JdbcDaoImpl sử dụng để tra cứu người dùng bằng cách tự tạo bean. Truy vấn mặc định rằng mùa xuân Security sử dụng là:

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

Bạn có thể sử dụng chức năng SQL thấp hơn để bỏ qua trường hợp:

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

các cấu hình XML Xuân An thích hợp là:

<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

Trong [http://static.springsource.org/spring-security/site/docs/3.1.x/reference/appendix-schema.html], cột tên người dùng được tạo bằng ** ignorecase ** : 'username varchar_ignorecase (50) không null primary key' – BenC

+0

Trang đó ghi lại các câu lệnh SQL cho HSQLDB. Cơ sở dữ liệu khác có thể hoặc không thể hỗ trợ 'varchar_ignorecase' ... ví dụ tôi sử dụng PostgreSQL không hỗ trợ nó. PostgreSQL không có một mô-đun 'citext' bổ sung làm một cái gì đó tương tự, nhưng nó không được cài đặt theo mặc định trong các phiên bản cũ để bổ sung' lower() 'vào truy vấn là một giải pháp dễ dàng hơn. – gutch

3

Tôi tin rằng bất kỳ nhà cung cấp xác thực nào đều tận dụng giao diện UserDetails và UserDetailsService.

Khi thực hiện

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

được đưa ra cho các ứng dụng tùy chỉnh cụ thể UserDetailsService, chúng ta có thể bỏ qua trường hợp của username và cung cấp các UserDetails vào mùa xuân-an ninh để tiến hành thêm chứng thực/giấy phép.

NHƯNG, nếu xuân cung cấp org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl được sử dụng như UserDetailsService nó sẽ được tải userdetails từ user bảng với điều kiện "where username=?". Vì vậy, nó là trường hợp nhạy cảm.

1

gutch là một phần đúng. Nó cho phép người dùng với JdbcDaoImpl kiểm tra không phân biệt dạng chữ với bảng người dùng. Nhưng bạn sẽ yêu cầu truy vấn bảng Authorities cũng cần phải được thay đổi.

<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> 
Các vấn đề liên quan