AuthenticationSuccessHandler

AuthenticationSuccessHandler

我有一个使用Spring 3.1的Java Webapp。我的Spring安全上下文定义了多个身份验证过滤器,每个过滤器对应于不同的身份验证路径(例如,用户名/密码与单点登录)。每个auth过滤器都定义自己的AuthenticationSuccessHandler。现在,我想注入(inject)2个其他操作以在成功进行身份验证时采取这些措施,它们应适用于所有身份验证类型:

  • 为Google Analytics(分析)设置跟踪事件代码,以在前端
  • 上使用
  • 在我们的数据库
  • 中更新用户的首选语言环境

    这些可以是用户成功通过身份验证后想要执行的任何操作。重要的一点是,与常规的AuthenticationSuccessHandlers(每个身份验证路径不同)不同,它们不会转发或重定向请求。因此,安全地调用一堆它们是安全的。

    是否有使用Spring Web/Security 3.1集成这些额外的身份验证成功“操作”的干净方法?

    我研究了实现 ApplicationListener<AuthenticationSuccessEvent> 的过程,但是我的事件需要访问该请求,并且AuthenticationSuccessEvent提供的全部就是Authentication对象本身。

    我找不到办法,所以我决定推出自己的代理服务器:
    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);
            }
        }
    }
    

    最佳答案

    在仔细研究了AbstractAuthenticationProcessingFilter的源代码以及其他所有调用AuthenticationSuccessHandler.onAuthenticationSuccess(...)的地方之后,我看不到使用Spring Security进行此操作的任何可能性。

    作为一种解决方法,您可以尝试将成功处理程序包装到某些AspectJ或AOP切入点中,然后将此切入点应用于AuthenticationSuccessHandler.onAuthenticationSuccess(...)执行。也许这样,您可以定位所有身份验证类型。

    09-28 01:37