【问题标题】:spring security AuthenticationManager vs AuthenticationProvider?spring security AuthenticationManager vs AuthenticationProvider?
【发布时间】:2011-01-20 08:53:51
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: spring authentication spring-security


    【解决方案1】:

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

    您可能希望向 ProviderManager 注册其他 AuthenticationProvider bean,您可以使用具有 ref 属性的元素来执行此操作,其中属性的值是您要添加的提供程序 bean 的名称。 em>

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

    【讨论】:

    • 因此,您很少需要实现 AuthenticationManager,而是只需实现 AuthenticationProviders 以从您想从任何地方获取用户详细信息?
    • 您可能需要的大多数 AuthenticationProvider 已经由编写 Spring Security 的人编写,并且就在 API 文档中,因此您可以对其进行配置。如果您需要的还没有在框架中,那么为您的目的实现 AuthenticationProvider 接口可能很简单。
    • 正如Hans所说,在Sprint Security中,ProviderManager类是AuthenticationManager的一个实现,它调用了Authentication方法AuthenticationProvider。该 Provider Manager 的方法签名是 org.springframework.security.providers.ProviderManager.doAuthentication(Authentication)
    • 您知道一些与自定义 AuthenticationManager 实现示例的链接吗?我正在尝试实现一个简单的案例作为更复杂案例的基础,但我无法弄清楚我应该在这个类中执行什么。我已经有一个 AuthenticationProvider 用于从数据库中检索用户数据。
    【解决方案2】:

    来自春天reference

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

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

    此外,如果您查看AuthenticationManagerProviderManagerAuthenticationProvider 的源代码,您可以清楚地看到这一点。

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

    【讨论】:

    • 同理,AuthenticationProvider的默认实现是什么
    【解决方案3】:

    AuthenticationManager 和 AuthenticationProvider 都是接口。它们在 Spring Security Flow 中具有不同的功能。

    参考-
    Spring Boot + Spring Security Architecture

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

  • AuthenticationProvider - AuthenicationProvider 是一个带有认证和支持方法的接口。它有各种实现,例如 CasAuthenticationProvider 或 DaoAuthenticationProvider。根据实现,使用适当的 AuthenicationProvider 实现。它在 AuthenticationProvider 实现的 authenticate 方法中进行所有实际的身份验证。

  • 【讨论】:

    • Gr8 流量+1。 Using the Authentication Object created 这个对象是在哪里以及如何创建的。这个对象有什么细节。我们可以显式创建它吗?
    • @Rehan,您应该编辑此响应并在身份验证提供程序接口下添加支持方法。
    猜你喜欢
    • 2016-12-07
    • 2015-12-28
    • 2020-04-29
    • 2016-07-19
    • 2012-02-03
    • 2017-05-27
    • 2013-01-27
    • 2015-09-30
    • 2019-02-06
    相关资源
    最近更新 更多