Tôi có một webapp java sử dụng Spring 3.1. Ngữ cảnh bảo mật mùa xuân của tôi xác định nhiều bộ lọc xác thực, mỗi bộ lọc tương ứng với một đường dẫn xác thực khác nhau (ví dụ: tên người dùng/mật khẩu so với Đăng nhập một lần). Mỗi bộ lọc auth định nghĩa riêng của nó AuthenticationSuccessHandler
. Bây giờ, tôi muốn tiêm 2 hành động bổ sung để có khi xác thực thành công, và họ nên áp dụng trên tất cả các loại xác thực:Cách sạch nhất để gọi nhiều AuthenticationSuccessHandlers?
- thiết lập một mã sự kiện theo dõi cho Google Analytics để sử dụng trên front-end
- cập nhật ngôn ngữ ưa thích của người dùng trong cơ sở dữ liệu của chúng tôi
Đây có thể là bất kỳ hành động nào mà bạn muốn móc, sau khi người dùng đã được xác thực thành công. Điểm quan trọng là, không giống như AuthenticationSuccessHandlers thông thường (khác với mỗi đường dẫn xác thực), chúng không chuyển tiếp hoặc chuyển hướng yêu cầu. Vì vậy, nó an toàn để gọi một bó của họ.
Có cách nào gọn gàng để tích hợp các "hành động" thành công xác thực bổ sung này, sử dụng Spring Web/Security 3.1 không?
Tôi đã xem xét triển khai ApplicationListener<AuthenticationSuccessEvent>
, nhưng sự kiện của tôi cần truy cập yêu cầu và tất cả các yêu cầu AuthenticationSuccessEvent
là chính đối tượng Authentication
.
tôi không thể tìm thấy một cách, vì vậy tôi đã quyết định để cuộn proxy của riêng tôi:
public class AuthenticationSuccessHandlerProxy implements AuthenticationSuccessHandler {
private List<AuthenticationSuccessHandler> authenticationSuccessHandlers;
public AuthenticationSuccessHandlerProxy(List<AuthenticationSuccessHandler> successHandlers) {
this.authenticationSuccessHandlers = successHandlers;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
for (AuthenticationSuccessHandler successHandler : this.authenticationSuccessHandlers) {
successHandler.onAuthenticationSuccess(request, response, authentication);
}
}
}