我有一个使用Spring 3.1的Java Webapp。我的Spring安全上下文定义了多个身份验证过滤器,每个过滤器对应于不同的身份验证路径(例如,用户名/密码与单点登录)。每个auth过滤器都定义自己的AuthenticationSuccessHandler
。现在,我想注入(inject)2个其他操作以在成功进行身份验证时采取这些措施,它们应适用于所有身份验证类型:
这些可以是用户成功通过身份验证后想要执行的任何操作。重要的一点是,与常规的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(...)
执行。也许这样,您可以定位所有身份验证类型。