Spring Security AuthenticationManager vs AuthenticationProvider? ?

有人能告诉我在 Spring Security 中 AuthenticationManagerAuthenticationProvider的区别吗?

它们是如何使用的,它们是如何被称呼的。我的理解是,SecurityFilter将调用 AuthenticationManager来验证 Authentication对象?但是 AuthenticationProvider在哪里发挥作用呢?

谢谢!

27443 次浏览

我认为 AuthenticationManager将持久用户信息的获取委托给一个或多个 AuthenticationProvider。身份验证提供程序(例如 DaoAuthenticationProvider, JaasAuthenticationProvider, LdapAuthenticationProvider, OpenIDAuthenticationProvider)专门用于访问特定的用户信息存储库。 参考手册的 这部分中还提到了其他内容,它说:

您可能希望向 ProviderManager 注册额外的 AuthenticationProvider bean,并且可以使用具有 ref 属性的元素来实现这一点,其中该属性的值是您想要添加的提供者 bean 的名称。

换句话说,您可以指定多个 AuthenticationProvider,例如一个用于在 LDAP 数据库中查找用户,另一个用于在 SQL 数据库中查找用户。

来自春季 参考文献

AuthenticationManager只是一个接口,所以实现可以是我们选择的任何东西

Spring Security 中的默认实现称为 ProviderManager,它并不处理身份验证请求本身,而是委托给一个已配置的 AuthenticationProvider列表,依次查询每个 AuthenticationProvider,以确定它是否可以执行身份验证。每个提供程序要么引发异常,要么返回一个完全填充的 Authentication对象。

另外,如果你检查源代码的 AuthenticationManagerProviderManagerAuthenticationProvider,你可以看到这一点清楚。

ProviderManager实现 AuthenticationManager接口,并且它有 AuthenticationProvider 列表。因此,如果希望拥有自定义身份验证机制,则需要实现新的 AuthenticationProvider

AuthenticationManager 和 AuthenticationProvider 都是接口,它们在 Spring 安全流中具有不同的功能。

裁判
Spring Boot + Spring 安全体系结构

enter image description here

  • AuthenticationManager -当用户试图访问应用程序时,http 请求被过滤器/过滤器链截获。然后,使用创建的 Authentication Object,过滤器将调用 Authentication Manager 的 Authenticate 方法。AuthenticationManager 只是一个接口,验证方法的实际实现由 ProviderManager 提供。ProviderManager 有一个 AuthenticationProvider 列表。从它的 AuthenticateProvider 方法调用适当的 AuthenticateProvider 的 Authenticate 方法。作为响应,如果身份验证成功,它将获取主体身份验证对象。

    enter image description here

  • AuthenticationProvider- AuthenticationProvider 是一个带有身份验证和支持方法的接口。它有各种各样的实现,如 CasAuthenticationProvider 或 DaAuthenticationProvider。根据实现的不同,将使用适当的 AuthenicationProvider 实现。它位于 AuthenticationProvider 实现身份验证方法中,所有实际身份验证都在该方法中进行。

    enter image description here