如何在 Spring 安全性中更改 ProviderManager 的行为?

How to Change behaviour of ProviderManager in Spring Security?

ProviderManager 的默认行为是:

  1. 尝试使用 AuthenticationProviders 列表进行身份验证,直到成功或耗尽所有 AuthenticationProviders。

  2. 如果抛出 InternalAuthenticationServiceException,ProviderManager 会重新抛出此异常,并且不会尝试使用更多 AuthenticationProvider。

  3. 如果抛出 AccountStatusException,ProviderManager 会重新抛出此异常,并且不会尝试使用更多 AuthenticationProvider。

我想要什么:

  1. 如果InternalAuthenticationServiceException,那么它应该检查是否允许使用其他AuthenticationProviders,如果是,那就去吧。

  2. 如果抛出 AuthenticationException,这意味着用户未经身份验证,而不是重新抛出它并向调用者发送未经身份验证的响应,不要尝试使用更多的 AuthenticationProviders。

我做了什么:

我制作了自己的 ProviderManager(我们称之为 MyProviderManager)class 并为 authenticate(Authentication authentication) 方法编写了自己的定义。

现在我希望 spring 使用 MyProviderManager 而不是 ProviderManager。

我该如何配置? 有办法吗? 如果不是,我可以通过哪些其他方法来更改 ProviderManager 的行为?

所以答案是

  1. 通过 XML 或 JAVA 定义您自己的 Provider bean 配置。

  2. 在 Http 和 global-method-security 中,添加 authentication-manager-ref 作为你的 bean id,Spring Security 将使用你的 Provider Manager 而不是 Springs '.