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

Spring Boot安全-多个身份验证提供程序

丁星火
2023-03-14

我的问题是,我希望有两个身份验证提供商

之前:我有我的UserDetailServiceImpl,我根据数据库中的数据验证了用户的身份(不确定是哪个提供者)

现在:我使用了ActiveDirectoryLdapAuthentiation提供程序,如下所示

  @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
        auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailService);
    }

    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
    }
    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
       MyActiveDirectoryLdapAuthenticationProvider provider = new MyActiveDirectoryLdapAuthenticationProvider(domain, url, rootDN);
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);

        return provider;
    }

我成功了,所以我可以认证。

问题是:

  1. 我现在无法再使用数据库用户登录,现在只有LDAP。
  2. 未使用UserDetailsService,因此用户具有哪个角色?
  3. 有没有办法为LDAP认证用户添加一些默认角色?

那么,如何同时启用这两个提供商呢?如何向用户添加角色,通过LDAP身份验证。供应商?

我也非常感谢对这里发生的事情的“大局”描述(在引擎盖下)。这里使用的每个类的作用是什么,它是如何工作的还不清楚(AuthentiationManager、AuthentiationManagerBuilder、AuthentiationProvider等)也许它只是被自动配置等隐藏了,但即使直接查看Spring Security也不会让我变得更聪明。

谢谢你的提示

更新此代码似乎工作正常

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailService);
    }

    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        MyActiveDirectoryLdapAuthenticationProvider provider = new MyActiveDirectoryLdapAuthenticationProvider(domain, url, rootDN);
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
        provider.setAuthoritiesMapper(new SimpleAuthorityMapper());
        return provider;
    }

共有1个答案

郭琦
2023-03-14

问题太多了!

这两个提供程序都已启用,因为您将它们都添加到AuthenticationManagerBuilder。但将它们添加到同一个过滤链中,并且都接受相同类型的身份验证作为输入,因此其中一个总是屏蔽另一个。

标准的LdapAuthenticationProvider有一个authoritiesMapper,您可以使用它将权限从目录条目映射到用户(通常是使用目录组直接完成的,例如,参见示例)。我想如果你的目录不包含组,你可以让所有用户拥有相同的权限,或者使用自定义映射器。

您的@Beans类型AuthenticationManagerAuthenticationProvider看起来有点多余(而且可能有害,因为它们是全局的,您正在为单个筛选器链配置AuthenticationManagerBuilder)。我怀疑你根本不需要AuthenticationManager方法,而另一个不需要是公共的或@Bean(可能)。

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

  • 在 spring security 中有几个对多个身份验证提供程序的引用,但在 Java config 中找不到示例。 以下链接给出了XML符号:Spring Security中的多个身份验证提供者 我们需要使用LDAP或DB进行身份验证 下面是我们的示例代码:

  • 我有一个使用bouncycastle库的Java applet。当我在Eclipse上运行应用程序时,一切正常,但当我在带有标记的浏览器上使用applet时,当我添加安全BouncyCastleProvider时,它会引发异常。 我的stackTrace是: 我正在使用bcpkix-jdk15on-1.48.jar和bcprov-jdk15on-1.48.jar版本的BouncyCastle。为什

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

  • 问题内容: 使用Passport.js是否可以为同一路由指定多个身份验证提供程序? 例如(在护照指南中),我可以在以下示例路线中使用本地策略以及Facebook和Twitter策略吗? 问题答案: Passport的中间件的构建方式使您可以在一个呼叫中使用多种策略。 但是,它是用OR顺序定义的。也就是说,只有在所有策略均未成功返回的情况下,它才会失败。 这是您将如何使用它: 换句话说,使用它的方法

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