春季安全AuthenticationManager与AuthenticationProvider?

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

他们如何使用,他们如何被称为。 我的理解是一个SecurityFilter会调用AuthenticationManager来authentication一个Authentication对象? 但是AuthenticationProvider在哪里起作用呢?

谢谢!

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

您可能想要使用ProviderManager注册更多的AuthenticationProvider bean,您可以使用具有ref属性的元素来执行此操作,其中属性的值是您要添加的提供者bean的名称。

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

从春季参考

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

Spring Security中的默认实现被称为ProviderManager,而不是自己处理authentication请求,它委托给一个configuration好的AuthenticationProvider列表,每一个都被查询是否可以执行authentication。 每个提供者将会抛出一个exception或返回一个完全填充的authentication对象。

另外,如果您检查AuthenticationManager,ProviderManager和AuthenticationProvider的源代码,您可以清楚地看到这一点。

ProviderManager实现AuthenticationManager接口,并具有AuthenticationProviders列表。 所以如果你想拥有自定义authentication机制,你需要实现新的AuthenticationProvider。