使用AuthenticationManagerBuilder的提供者订单 - java

我正在使用Spring Security 4.0.1,并希望使用多个身份验证提供程序来使用基于Java的配置进行身份验证。如何指定提供者订单?

我希望使用AuthenticationManagerBuilder,因为这是WebSecurityConfigurerAdapter.configureGlobal()公开的内容,但是我看不到任何指定顺序的方法。我需要手动创建ProviderManager吗?

更新:这是根据Arun的答案进行的问题澄清。我要使用的特定提供程序是ActiveDirectoryLdapAuthenticationProviderDaoAuthenticationProvider,用于自定义UserService

最终,我想首先针对DaoAuthenticationProvider和第二对ActiveDirectoryLdapAuthenticationProvider进行身份验证。

AD提供程序涉及对AuthenticationManagerBuilder.authenticationProvider()的调用,而DAO提供程序涉及对AuthenticationManagerBuilder.userService()的调用,这会在幕后围绕用户服务创建DaoAuthenticationProvider。查看源代码,它不会直接将提供程序放置在提供程序列表中(它会创建配置程序),因此Arun的答案对我不起作用。

我尝试手动创建DaoAuthenticationProvider并将其传递给authenticationProvider()。它并没有影响订单。

参考方案

我在configure方法中尝试了一个objectPostProcessor,它起作用了。不确定这是否是您想要的:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.jdbcAuthentication().dataSource(dataSource)
           .passwordEncoder(new BCryptPasswordEncoder());
      auth.authenticationProvider(new CustomAuthenticationProvider(this.dataSource));

      auth.objectPostProcessor(new ObjectPostProcessor<Object>() {
        @Override
        public <O> O postProcess(O object) {
            ProviderManager providerManager = (ProviderManager) object;
            Collections.swap(providerManager.getProviders(), 0, 1);
            return object;
        }
    });
}

这是WebSecurityConfigurerAdapter继承的类上的configure方法。

对象后处理器的原因是,我们需要等待AuthenticationManagerBuilder实际构建对象,然后才能访问和更改提供程序列表的顺序。

希望能对您有所帮助。

Spring MVC Web应用程序检测暴力攻击的最佳方法? - java

Spring 3.0 MVC中是否有专门用于帮助检测Web应用程序的身份验证/登录页面上的蛮力攻击的功能? 参考方案 经过长期验证的实践是,如果身份验证失败,则会引入随机但相当大的延迟。这样,合法用户将立即登录,但攻击者每次尝试将花费500ms-1s,这使整个暴力概念不切实际(将永远存在)。合法用户偶尔失败的登录只会使他们稍有延迟,并且不会引起注意。如果需要…

Spring MVC中的输入验证 - java

我知道Commons Validator框架是Struts项目在服务器端和客户端验证输入值的事实上的标准。Spring MVC项目是否也是如此?我得到的印象可能不是,大多数Struts书籍和论坛都谈论Commons Validator框架,但是只有少数Spring书籍和论坛可以。在Spring MVC项目中验证输入的最佳实践是什么?干杯! 参考方案 在引入S…

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring Security @Secured批注和用户权限 - java

这是关于Spring v.4(MVC +安全性)的。我已经实现了UserDetailsServiceImpl,其中在loadUserByUsername方法内部向用户授予了其权限。说的很简单:public UserDetails loadUserByUsername(String username) { ... Collection<GrantedAu…

春季安全值得付出努力 - java

我一直在关注春季安全性,并注意到它是多么大的包装。我想知道是否值得花一些时间来加强这一点。Spring Security 2.0+为您节省了大量时间,还是以任何方式简化了您的项目? java参考方案 几年前,我考虑将其用于Spring项目,并选择了它,因为它是一个非常繁琐的框架,恕我直言,它提供的灵活性不是必需的。 (据我估计)减少我们自己的身份验证/授权的…