Tôi có 2 ứng dụng Khởi động mùa xuân riêng biệt, một ứng dụng phục vụ như một máy chủ ủy quyền OAuth 2 và máy chủ khác làm máy chủ tài nguyên. Tôi đang sử dụng số RemoteTokenServices
của Spring trong máy chủ tài nguyên của mình để kiểm tra mã thông báo từ máy chủ ủy quyền. Bây giờ, tôi đang cố gắng định nghĩa mã điều khiển được bảo vệ trong ứng dụng máy chủ tài nguyên của mình, nhưng tôi không chắc chắn cách ánh xạ lớp UserDetails
tới hiệu trưởng xác thực được cung cấp thông qua cơ chế OAuth 2.Làm cách nào để ánh xạ mã thông báo OAuth 2 tới đối tượng UserDetails trong máy chủ tài nguyên?
Tôi đã thiết lập máy chủ ủy quyền với TokenEnhancer
tùy chỉnh bổ sung thêm chi tiết vào mã thông báo sao cho /oauth/check_token?token=<token>
trả về với trường tùy chỉnh mà tôi muốn ánh xạ tới bộ điều khiển máy chủ tài nguyên của mình.
Trong một thiết lập nguyên khối nhiều nơi máy chủ uỷ quyền cũng là máy chủ tài nguyên, tôi có thể xác định phương pháp điều khiển mà làm cho việc sử dụng chính xác nhận theo cách này:
//User implements UserDetails
public Map<String, Object> getResource(@AuthenticationPrincipal User user) {
//code that uses the user object
}
Tuy nhiên, điều này dường như không làm việc thẳng tiến theo cách tiếp cận phân tán hơn. Ánh xạ không thành công và tham số user
kết thúc là đối tượng rỗng. Tôi đã cố gắng sử dụng các phương pháp sau đây:
public Map<String, Object> getResource(Authentication authentication) {
//code that uses the authentication object
}
Mặc dù mã bản đồ trên thành công các chi tiết xác thực, nó không cung cấp một cách cho tôi để truy cập trực tiếp các lĩnh vực tùy chỉnh tôi đã thiết lập thông qua TokenEnhancer
tôi đã đề cập trước đó. Tôi dường như không thể tìm thấy bất cứ điều gì từ tài liệu Spring về vấn đề này.
Giải pháp này hoạt động, nhưng nó là một giải pháp thay vì sửa lỗi. Lý do bạn nhận được String for Principle là vì userDetailsService không được tiêm đúng vào DefaultUserAuthenticationConverter(). Bây giờ câu hỏi là nó cần phải được tiêm ở đâu để giải pháp này không cần thiết? – zalis