如何在 Spring 安全性中更改 ProviderManager 的行为?
How to Change behaviour of ProviderManager in Spring Security?
ProviderManager 的默认行为是:
尝试使用 AuthenticationProviders 列表进行身份验证,直到成功或耗尽所有 AuthenticationProviders。
如果抛出 InternalAuthenticationServiceException,ProviderManager 会重新抛出此异常,并且不会尝试使用更多 AuthenticationProvider。
如果抛出 AccountStatusException,ProviderManager 会重新抛出此异常,并且不会尝试使用更多 AuthenticationProvider。
我想要什么:
如果InternalAuthenticationServiceException,那么它应该检查是否允许使用其他AuthenticationProviders,如果是,那就去吧。
如果抛出 AuthenticationException,这意味着用户未经身份验证,而不是重新抛出它并向调用者发送未经身份验证的响应,不要尝试使用更多的 AuthenticationProviders。
我做了什么:
我制作了自己的 ProviderManager(我们称之为 MyProviderManager)class 并为 authenticate(Authentication authentication) 方法编写了自己的定义。
现在我希望 spring 使用 MyProviderManager 而不是 ProviderManager。
我该如何配置?
有办法吗?
如果不是,我可以通过哪些其他方法来更改 ProviderManager 的行为?
所以答案是
通过 XML 或 JAVA 定义您自己的 Provider bean 配置。
在 Http 和 global-method-security 中,添加 authentication-manager-ref 作为你的 bean id,Spring Security 将使用你的 Provider Manager 而不是 Springs '.
ProviderManager 的默认行为是:
尝试使用 AuthenticationProviders 列表进行身份验证,直到成功或耗尽所有 AuthenticationProviders。
如果抛出 InternalAuthenticationServiceException,ProviderManager 会重新抛出此异常,并且不会尝试使用更多 AuthenticationProvider。
如果抛出 AccountStatusException,ProviderManager 会重新抛出此异常,并且不会尝试使用更多 AuthenticationProvider。
我想要什么:
如果InternalAuthenticationServiceException,那么它应该检查是否允许使用其他AuthenticationProviders,如果是,那就去吧。
如果抛出 AuthenticationException,这意味着用户未经身份验证,而不是重新抛出它并向调用者发送未经身份验证的响应,不要尝试使用更多的 AuthenticationProviders。
我做了什么:
我制作了自己的 ProviderManager(我们称之为 MyProviderManager)class 并为 authenticate(Authentication authentication) 方法编写了自己的定义。
现在我希望 spring 使用 MyProviderManager 而不是 ProviderManager。
我该如何配置? 有办法吗? 如果不是,我可以通过哪些其他方法来更改 ProviderManager 的行为?
所以答案是
通过 XML 或 JAVA 定义您自己的 Provider bean 配置。
在 Http 和 global-method-security 中,添加 authentication-manager-ref 作为你的 bean id,Spring Security 将使用你的 Provider Manager 而不是 Springs '.