2010-07-20 32 views
6

Trong ứng dụng của tôi, tôi đang sử dụng xác thực LDAP. Nhưng tôi cũng có 2 dịch vụ từ xa yêu cầu xác thực thông qua đăng nhập phương thức (tên người dùng, mật khẩu). Phương thức này trả về mã thông báo bảo mật giúp tôi có thể gọi một phương thức khác, tức là tôi phải chuyển mã thông báo bảo mật cho các phương thức dịch vụ làm đối số đầu tiên.
Vì vậy, tôi muốn nhận các mã thông báo bảo mật này ngay sau khi đăng nhập thành công bằng LDAP và lưu trữ chúng trong SecurityContext. Tôi đã cố gắng sử dụng xác thực-thành công-handler-ref của hình thức đăng nhập yếu tố. Sử dụng trình xử lý, tôi thay thế đối tượng Xác thực trong SecurityContext bằng tùy chỉnh AuthenticationToken không chỉ giữ mật khẩu mà còn cả mã thông báo bảo mật. Nhưng trong trường hợp này, tôi có ngoại lệ là không có nhà cung cấp xác thực nào hỗ trợ lớp mã thông báo này. Tôi biết nó cũng có thể lưu trữ mã thông báo trong phiên HTTP nhưng trong trường hợp này tôi phải chuyển phiên sang đối tượng dịch vụ, vì vậy tôi muốn lưu trữ mã thông báo trong SecurityContext.Làm cách nào để lưu trữ thông tin tùy chỉnh trong SecurityContext của bảo mật mùa xuân?

Cách tiếp cận tốt nhất để xử lý mã thông báo bảo mật dịch vụ là gì?

Trả lời

10

Tôi thường sử dụng đối tượng Authentication.getDetails() để lưu trữ thông tin bổ sung mà có thể không được liên kết trực tiếp đến người sử dụng mỗi nói. Vì vậy, bạn có thể lưu trữ bất kỳ đối tượng nào bạn muốn trong trường đó (ví dụ HashMap) và chia sẻ vòng đời đối tượng Authentication.

HashMap<String, Object> info = new HashMap<String, Object>(); 
info.put("extraInfo", "info"); 
auth.setDetails(info); 
... 
Map<String, Object> i = (Map<String, Object>)SecurityContextHolder.getContext().getAuthentication.getDetails(); 
4

Việc triển khai 'UserDetails' của bạn có thể chứa bất kỳ dữ liệu bổ sung nào. Đây là những gì được lưu trữ trong SecurityContext mà sau này có thể truy cập sau khi đăng nhập thành công.

Bạn sau đó có thể truy cập vào nó như là (Giả MyUserDetails thực hiện UserDetails)

Object principal = SecurityContextHolder.getContext().getAuthentication(); 
if (principal instanceof MyUserDetails) { 
    MyUserDetails mud = (MyUserDetails) principal; 
    mud.getMyData(); //Extract your additional data here 
} 
+0

Tôi không chắc chắn rằng tôi có thể sử dụng userDetailsSerivce với xác thực LDAP. – viator

+1

Bạn không cần triển khai toàn bộ UserDetailsService. Bạn chỉ có thể sử dụng của riêng bạn thực hiện UserDetails với LDAP. Dưới đây là thông tin về cách thực hiện điều này - http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html#ldap-custom-user-details – Gopi

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