Spring - 在所有自定义身份验证提供程序的末尾记录安全性违规

时间:2016-10-17 18:33:17

标签: authentication grails spring-security

我有一个业务要求,我使用两个自定义身份验证提供程序。现在,如果第一个提供程序无法成功进行身份验证,它会通过ApplicationEventPublisher在DB中记录违规条目,同样也适用于第二个提供程序。

现在有些用户只能由第二个提供商进行身份验证,有些用户可以通过第一个用户进行身份验证,而出于其他商业原因,我需要同时使用这两个提供商,并允许这两组用户进行身份验证。

这里的问题是,如果用户能够通过任一提供商进行身份验证,我不希望记录安全违规。

只有当提供商尝试过并且失败时才会发生类似违规记录的事情。我想过为此使用AuthenticationFailureHandler。

预期情景

  1. AuthProvider1失败。
  2. AuthProvider2失败。
  3. 只有现在,违规才会被记录(可能是通过AuthenticationFailureHandler或其他人可能建议的其他内容)。
  4. 问题是如何在两个Auth Providers完成后将执行流程指向AuthenticationFailureHandler。

    提前致谢!

1 个答案:

答案 0 :(得分:0)

它当前是如何工作的 - 在没有成功验证的情况下循环遍历所有可用的提供者之后,抛出了来自最后一个提供者的AuthenticationException(或者如果全部弃用并且没有异常,则抛出ProviderNotFoundException) )。这会将流回弹到调用ProviderManager.authenticate()(通常是AbstractAuthenticationProcessingFilter的子类)的过滤器,并调用AuthenticationFailureHandler.onAuthenticationFailure()来执行身份验证失败后需要执行的任何工作,通常会重定向回登录页。

特别查看ProviderManagerauthenticate()的实施情况,您会发现它非常接近您正在寻找的内容。您可能需要稍微调整一下逻辑,但应该能够重用大部分逻辑。