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

时间:2015-02-10 15:00:17

标签: spring security authentication spring-security spring-boot

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

BEFORE: 我有我的UserDetailServiceImpl并且我根据DB验证了用户(不确定是什么提供者)用户根据DB中的数据获得了角色

立即: 我使用了ActiveDirectoryLdapAuthentication提供程序,如下所示

  @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. 未使用UserDetailsS​​ervice,用户具有哪个角色?
  3. 是否有办法向LDAP认证用户添加一些默认角色?
  4. 那么如何启用两个提供商? 如何向用户添加角色,通过LDAP auth.provider进行身份验证?

    我也非常感谢"大图片"描述这里发生了什么(引擎盖下)。这里使用的每个类的作用是什么,它真的不清楚它是如何工作的(AuthenticationManager,AuthenticationManagerBuilder,AuthenticationProvider等)也许它只是被自动配置所隐藏,所以,但即使是直接查看Spring Security也不能让我任何更聪明的人。

    感谢任何提示

    UPDATE 此代码似乎正常工作

        @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 个答案:

答案 0 :(得分:1)

问题太多了!

两个提供程序都已启用,因为您将它们都添加到AuthenticationManagerBuilder。但是你将它们都添加到同一个过滤器链中,并且都接受相同类型的Authentication作为输入,因此其中一个总是掩盖另一个。

标准LdapAuthenticationProviderauthoritiesMapper,您可以使用@Beans将目录条目中的权限映射到您的用户(通常使用目录组开箱即用,例如,请参阅{{3} })。我想如果您的目录不包含组,则可以使所有用户具有相同的权限或使用自定义映射器。

您的AuthenticationManager类型AuthenticationProviderAuthenticationManagerBuilder看起来多余(可能有害,因为它们是全球性的,您正在为单个过滤器链配置AuthenticationManager) 。我怀疑你需要@Bean方法,而另一方法不需要公开或{{1}}(可能)。