我有一个业务要求,我使用两个自定义身份验证提供程序。现在,如果第一个提供程序无法成功进行身份验证,它会通过ApplicationEventPublisher在DB中记录违规条目,同样也适用于第二个提供程序。
现在有些用户只能由第二个提供商进行身份验证,有些用户可以通过第一个用户进行身份验证,而出于其他商业原因,我需要同时使用这两个提供商,并允许这两组用户进行身份验证。
这里的问题是,如果用户能够通过任一提供商进行身份验证,我不希望记录安全违规。
只有当提供商尝试过并且失败时才会发生类似违规记录的事情。我想过为此使用AuthenticationFailureHandler。
预期情景:
问题是如何在两个Auth Providers完成后将执行流程指向AuthenticationFailureHandler。
提前致谢!
答案 0 :(得分:0)
它当前是如何工作的 - 在没有成功验证的情况下循环遍历所有可用的提供者之后,抛出了来自最后一个提供者的AuthenticationException(或者如果全部弃用并且没有异常,则抛出ProviderNotFoundException) )。这会将流回弹到调用ProviderManager.authenticate()
(通常是AbstractAuthenticationProcessingFilter
的子类)的过滤器,并调用AuthenticationFailureHandler.onAuthenticationFailure()
来执行身份验证失败后需要执行的任何工作,通常会重定向回登录页。
特别查看ProviderManager
和authenticate()
的实施情况,您会发现它非常接近您正在寻找的内容。您可能需要稍微调整一下逻辑,但应该能够重用大部分逻辑。