2011-12-28 11 views
6

Tôi muốn thêm muối như:Xuân An muối cho UserDetails tùy chỉnh

PasswordEncoder encoder = new ShaPasswordEncoder(); 
     userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails)); 

như xa userDetails được thể hiện của lớp tùy chỉnh UserDetail của tôi, tôi buộc phải bỏ nó vào lớp mùa xuân này: UserDetails , nhưng như nó một cách logic mong đợi tôi đã nhận trong Runtime:

java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails 

config:

<beans:bean id="saultSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource"> 
     <beans:property name="userPropertyToUse" value="username"/> 
</beans:bean> 

<authentication-manager alias="authenticationManager"> 
<authentication-provider> 
<password-encoder hash="sha"> 
    <salt-source user-property="username"/> 
</password-encoder> 
    <jdbc-user-service data-source-ref="dataSource"/> 
</authentication-provider> 
</authentication-manager> 

Làm cách nào để định cấu hình chính xác muối trong trường hợp này?

Trả lời

3

ReflectionSaltSource chỉ làm việc với một đối tượng UserDetails (Tôi giả định đó là nơi bạn có được ngoại lệ đẳng cấp đúc?), Do đó bạn sẽ phải hoặc là thực hiện UserDetails hoặc tạo SaltSource thực hiện của riêng bạn mà làm việc với đối tượng của bạn.

Tuy nhiên, tôi sẽ không sử dụng thuộc tính của người dùng làm muối trừ khi bạn đang làm việc với hệ thống cũ đã thực hiện điều này. Tên người dùng không phải là một giá trị muối rất tốt. Tốt hơn là sử dụng một loại muối ngẫu nhiên được lưu trữ bằng mật khẩu. Một ví dụ điển hình là thuật toán BCrypt. Xem câu trả lời của tôi cho this question để biết ví dụ về cách sử dụng nó với Spring Security 3.1. Như đã giải thích ở đó, BCrypt tự động tạo ra một muối ngẫu nhiên mà nó lưu trữ trong cùng một chuỗi với mật khẩu băm.

Lưu ý rằng thực tế có giao diện PasswordEncoder mới trong gói "mật mã" 3.1 của Spring Security (trong org.springframework.security.crypto.password). Điều này không bao gồm một muối trong API methods, vì nó giả định muối được tạo ra trong nội bộ (vì nó là với việc thực hiện BCrypt). Khung thường sẽ chấp nhận một trong các khung này hoặc di sản org.springframework.security.authentication.encoding.PasswordEncoder.

+0

+1 cho 'BCryptPasswordEncoder' – Roadrunner

+0

@Luke, như tôi đã hiểu từ bài đăng được liên kết của bạn,' BCrypt' đã chứa Muối. Tôi có thể định cấu hình Muối trong trường hợp này như thế nào? Có thể cấu hình ở tất cả, khi sử dụng 'BCrypt'? Có nói:" Điều này tự động tạo ra một muối và nối nó với giá trị băm trong một chuỗi " – sergionni

+1

@sergionni: thông báo thay đổi API trong Spring Security! Trong 3.0.x, [PasswordEncoder] (http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/authentication/encoding/PasswordEncoder.html) sử dụng muối để mã hóa mật khẩu. Nhưng trong 3.1.x [PasswordEncoder] (http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html) doesn ' t sử dụng muối. Lời khuyên của Luke chỉ dành cho phiên bản 3.1.x ** **. – Roadrunner

1

lớp model.UserDetails của bạn phải thực hiện các giao diệnorg.springframework.security.core.userdetails.UserDetails- nó không cần phải là một lớp org.springframework.security.core.userdetails.User.

Bạn cũng có thể xem this answer để xem cách thiết lập ReflectionSaltSource cho cả mã hóa và giải mã mật khẩu hoặc giúp bạn có được bức tranh lớn hơn để theo mẹo tuyệt vời của Luke trên BCryptPasswordEncoder.

+0

Tôi đã xem bài đăng của bạn trước đó.Tôi hiểu rằng lớp 'CustomUserDetails' trong nó thực hiện' UserDetails' của mùa xuân, phải không? Trường hợp là, tôi không cần triển khai nó ngay bây giờ. Tùy chỉnh 'UserDetails' khá nhỏ và đủ rồi. – sergionni

+1

@sergionni: Đây chỉ là trình giữ chỗ ví dụ - Bạn có thể sử dụng bất kỳ triển khai nào của 'org.springframework.security.core.userdetails.UserDetails' thay cho 'CustomUserDetails' - nó có thể là của riêng bạn, nhỏ hoặc nổi bật hoặc một được cung cấp với khung công tác 'org.springframework.security.core.userdetails.User'. Phần chính của bài viết của tôi là về cấu hình 'SaltSource'. – Roadrunner