2013-08-08 27 views
5

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?

  1. thiết lập một mã sự kiện theo dõi cho Google Analytics để sử dụng trên front-end
  2. 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); 
     } 
    } 
} 

Trả lời

0

Sau khi xem breafly vào mã nguồn của AbstractAuthenticationProcessingFilter và tất cả những nơi khác, nơi AuthenticationSuccessHandler.onAuthenticationSuccess(...) được gọi là tôi không thấy bất kỳ khả năng thực hiện nó bằng cách sử dụng Spring Security.

Để giải quyết sự cố, bạn có thể thử đưa trình xử lý thành công của mình vào một số phím tắt AspectJ hoặc AOP rồi áp dụng thao tác này để thực hiện AuthenticationSuccessHandler.onAuthenticationSuccess(...). Có thể như thế này bạn có thể nhắm mục tiêu tất cả các loại xác thực.

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