当前位置: 首页 > 知识库问答 >
问题:

Spring Security多个成功的身份验证提供程序

左丘烨烁
2023-03-14

我希望我的web应用程序的用户通过LDAP和额外的自定义身份验证进行身份验证。这是一个用Kotlin编写的Spring Boot应用程序。我将AuthenticationManagerBuilder配置为

@Autowired
lateinit var authenticationProvider: CustomAuthenticationProvider

override fun configure(auth: AuthenticationManagerBuilder) {
    auth
            .authenticationProvider(authenticationProvider)

    auth
            .ldapAuthentication()
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource()
                .url("ldap://localhost:8389/dc=example,dc=com")
            .and()
                .passwordCompare()
                .passwordEncoder(PlaintextPasswordEncoder())
                .passwordAttribute("userPassword")
}

我希望链接身份验证,以便如果CustomAuthenticationProvider成功地进行身份验证(函数authenticate不抛出),身份验证将继续使用LDAP身份验证提供程序。

正如所写的,如果CustomAuthenticationProvider成功地进行了身份验证,则不会评估LDAP身份验证(以及任何后续的身份验证提供程序)。只有在CustomAuthenticationProvider抛出时才执行LDAP身份验证。

我阅读了许多文章(例如Spring Security中的多个身份验证提供程序),这些文章详细介绍了具有多个身份验证提供程序,但使用OR行为而不是AND行为。有什么建议吗?

共有1个答案

李永寿
2023-03-14

也许我有一些。但让我们分析一下之前在引擎盖下发生的事情。

Spring Security(ProviderManager)中的默认身份验证管理器实现维护一个身份验证提供程序列表,第一个执行成功身份验证的提供程序将停止链,其余的不调用。我相信你无法改变这一点。使用AuthenticationManagerBuilder时,可以在ProviderManager中添加身份验证提供程序。

下面的图像显示了正在发生的事情的高级概述:

public Authentication authenticate(Authentication authentication)
            throws AuthenticationException {
        Class<? extends Authentication> toTest = authentication.getClass();
        ...
        for (AuthenticationProvider provider : getProviders()) {
            if (!provider.supports(toTest)) {
                continue;
            }

            try {
                result = provider.authenticate(authentication);

                if (result != null) {
          ...
                    break;
                }
            }
      ...
            catch (AuthenticationException e) {
                lastException = e;
            }
        }

        if (result != null) {
            ...
            return result;
        }
  }
  1. 在筛选器链中提供自己的身份验证管理器实现。这对我来说似乎有点挑战性。
  2. 确保自定义身份验证提供程序处理所有必要的身份验证操作。
 类似资料:
  • 问题内容: 使用Passport.js是否可以为同一路由指定多个身份验证提供程序? 例如(在护照指南中),我可以在以下示例路线中使用本地策略以及Facebook和Twitter策略吗? 问题答案: Passport的中间件的构建方式使您可以在一个呼叫中使用多种策略。 但是,它是用OR顺序定义的。也就是说,只有在所有策略均未成功返回的情况下,它才会失败。 这是您将如何使用它: 换句话说,使用它的方法

  • 问题内容: 我的Web应用程序有多个身份验证管理器(一个用于API,一个用于WEB访问)。该api应该仅具有基本的身份验证服务- 通过spring安全标记进行配置,如下所示: 我无法内联身份验证提供程序,因为我希望它可以被子bean配置覆盖。 我的问题是我无法在security:authentication-provider元素上定义别名/ id以在身份验证管理器中引用它。有一个简单的解决方法吗?

  • 我的问题是,我希望有两个身份验证提供商 之前:我有我的UserDetailServiceImpl,我根据数据库中的数据验证了用户的身份(不确定是哪个提供者) 现在:我使用了ActiveDirectoryLdapAuthentiation提供程序,如下所示 我成功了,所以我可以认证。 问题是: 我现在无法再使用数据库用户登录,现在只有LDAP。 未使用UserDetailsService,因此用户具

  • 我正在尝试在Spring身份验证服务器(Spring Security)中配置多个身份验证提供程序(主要和次要) 根据“身份验证”方法留档: 返回:包含凭据的完全经过身份验证的对象。如果AuthenticationProvider无法支持对传递的身份验证对象的身份验证,则可能返回null。在这种情况下,将尝试下一个支持提供的身份验证类的AuthenticationProvider。 如果身份验证失

  • 我正在尝试为正在进行的 spring-boot 项目实现身份验证和授权服务。我已经实现了一个基于 JPA 的身份验证提供程序,它工作正常。如何将 LDAP 身份验证提供程序添加到同一项目并根据用户身份验证类型在身份验证方法之间切换? 下面是我的代码 虽然我的LDAP证书是正确的,但它没有达到那个方法。如何从DB ex(LDAP、JPA、SSO)获取我的应用程序的身份验证方法,并执行相应的身份验证提

  • 问题内容: 在Spring Security中,有多个身份验证提供程序的参考,但是找不到Java config中的示例。 以下链接给出了XML表示法: Spring Security中的多个身份验证提供程序 我们需要使用LDAP或DB进行身份验证 下面是我们的示例代码: 问题答案: 也许这会帮助你: