2012-02-15 39 views
5

Có đơn giản webapp Xuân An với mã hóa mật khẩu:Authentication trong Xuân An whith mật khẩu được mã hóa

<security:authentication-manager alias="authenticationManager"> 
<security:authentication-provider user-service-ref="personService"> 
    <security:password-encoder hash="md5" ref="passwordEncoder"> 
     <!-- <security:salt-source user-property="username"/> --> 
    </security:password-encoder> 
</security:authentication-provider> 
</security:authentication-manager> 

Encoding cũng đơn giản:

person.setPassword(encoder.encodePassword(person.getPassword(), null)); 

Vì vậy, trong DataBase tất cả mật khẩu sẽ được mã hóa. Bây giờ tôi muốn thực hiện xác thực của một số người dùng với tên người dùng nhất định trong apllication. Trước (khi passswords là trong bản rõ) nó là như thế này:

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
       username, password); 
Authentication authentication = authenticationManager.authenticate(token); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

Nhưng bây giờ tôi nhận được mã hóa mật khẩu từ DB và không thể làm thẩm định như trước đây.

Sự cố. rằng Spring không biết rằng mật khẩu cames từ UsernamePasswordAuthenticationToken đã được mã hóa. Và anh ta mã hóa nó lần thứ hai. Ai có thể giúp đỡ?

Sửa

Vì vậy, tôi thấy hai giải pháp ở đây:

  1. thực hiện DaoAuthenticationProvider tùy chỉnh nơi thêm séc nếu cả hai mật khẩu đã băm
  2. thực hiện xác thực tùy chỉnh và đặt nó trong bối cảnh an ninh bằng tay.

Mọi người khác? Cai gi la tot nhat?

+0

Bao gồm một số SpringSecurity trong [chi tiết ở đây] (http://techastute.blogspot.com /2013/01/spring-security-in-detail.html), có thể hữu ích cho một số. – raksja

Trả lời

7

Bạn chưa thực sự nói điều gì sai, nhưng mã xác thực phải giống hệt với phiên bản không được băm.

Nếu bạn có mật khẩu băm trong cơ sở dữ liệu và bộ mã hóa tương ứng được đưa vào nhà cung cấp xác thực, mật khẩu do người dùng cung cấp sẽ được bộ mã hóa băm trước khi so sánh nó với phiên bản cơ sở dữ liệu.

đảm bảo:

  1. Bạn sử dụng các giá trị mật khẩu unhashed khi tạo UsernamePasswordAuthenticationToken
  2. Giá trị trong cơ sở dữ liệu thực sự là giống như băm được tạo ra bởi bộ mã hóa. Tự tải nó và kiểm tra nó trong một thử nghiệm. Cơ sở dữ liệu có thể lưu trữ nó trong trường hợp trên, ví dụ.

Ngoài ra, bạn có lẽ nên chọn thứ gì đó tốt hơn MD5 đơn giản. Bạn có thể muốn xem bcrypt, ví dụ, được hỗ trợ trong Spring Security 3.1 và tự động sử dụng một giá trị muối ngẫu nhiên.

Cập nhật

đề nghị của bạn tạo ra một nhà cung cấp mà chấp nhận mật khẩu băm không phải là một tốt nhất. Điều này sẽ cho phép bất cứ ai đánh cắp một mật khẩu băm để xác thực với nó trực tiếp (do đó đánh bại mục đích của băm ở nơi đầu tiên).

Chỉ cần xác nhận liên kết URL email của bạn, tải các thông tin cho người dùng đó và tạo ra một đối tượng Authentication cho họ:

UserDetails user = ... // load user here 
Authentication a = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); 
SecurityContextHolder.getContext().setAuthentication(a); 
+0

Vấn đề ở 1. Khi tạo UsernamePasswordAuthenticationToken tôi chỉ có phiên bản băm mật khẩu khi tôi tải đối tượng UserDetails từ DB (trong trường hợp của tôi - bằng khóa xác nhận) – vacuum

+0

Sử dụng mật khẩu đã lưu sẽ không xác thực người dùng (mà tôi giả định là những gì bạn đang cố gắng làm). Nếu không, bạn sẽ cần phải làm rõ những gì bạn đang cố gắng đạt được. Không có nhiều điểm trong việc gọi người quản lý xác thực bằng mật khẩu mà bạn biết là chính xác trước. –

+0

Tôi đang cố gắng xác thực người dùng, người đã nhấp vào liên kết từ email đăng ký. Vì vậy, đối tượng UserDetails đến từ DB bằng khóa xác nhận đến từ liên kết xác nhận trong email. – vacuum

Các vấn đề liên quan