调用多个 AuthenticationSuccessHandler 的最简洁方法?

Posted

技术标签:

【中文标题】调用多个 AuthenticationSuccessHandler 的最简洁方法?【英文标题】:Cleanest way to call multiple AuthenticationSuccessHandlers? 【发布时间】:2013-08-10 18:28:03 【问题描述】:

我有一个使用 Spring 3.1 的 java webapp。我的 Spring 安全上下文定义了多个身份验证过滤器,每个过滤器对应一个不同的身份验证路径(例如,用户名/密码与单点登录)。每个身份验证过滤器都定义了自己的AuthenticationSuccessHandler。现在,我想注入 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);
        
    

【问题讨论】:

【参考方案1】:

在简要查看AbstractAuthenticationProcessingFilter 的源代码以及所有其他调用AuthenticationSuccessHandler.onAuthenticationSuccess(...) 的地方后,我认为使用 Spring Security 没有任何可能。

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

【讨论】:

以上是关于调用多个 AuthenticationSuccessHandler 的最简洁方法?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

如何阻止多个重新渲染执行多个 api 调用 useEffect?

PHPUnit:如何使用多个参数模拟多个方法调用?

同一站点的多个选项卡是不是发送多个 ajax 调用?

是否可以使用 terragrunt 调用多个 terraform 模块