0

注意:我的应用程序使用最新版本的 Spring 框架 4.0.6、3.2.4 来保证安全性,并且它不使用 xml 而只使用 Java-Config 来配置应用程序。

我有一组服务,我想通过角色和其他业务特定授权条件来保护它们。这些服务被分组到一个模块(一个 jar)中,供 REST 应用程序和 Web 应用程序使用。我已经有一个AuthenticationProviderweb 应用程序(REST 应用程序处于初始阶段)。我@EnableGlobalMethodSecurity在网络应用程序中使用。话虽如此,我现在也需要保护服务中的方法。在这种情况下,我是否需要提供另一个身份验证提供程序?或者,将身份验证提供程序移动到服务模块以便 web/rest 应用程序使用服务 jar 中的身份验证提供程序是否正确?如果我@EnableGlobalMethodSecurity在服务模块的 ApplicationServiceConfig.java 中进行配置,我会得到打击异常。

com.name.mvoice.project.service.ApplicationServiceConfig: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: An AuthenticationManager is required

如果应用程序需要双重身份验证,一个来自 RDBMS,另一个来自 LDAP,我该如何配置安全性。条件应该是用户信息应该在两个系统中都存在并启用。我是否需要在现有的身份验证管理器本身中编写此内容,还是应该为 LDAP 提供单独的身份验证提供程序?如果有怎么办?

WebSecurityConfig.java

 @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception {
    AuthenticationProvider dbAuthenticationProvider = new DatabaseAuthenticationProvider();
    auth.authenticationProvider(dbAuthenticationProvider );
    // is it right to do like this
   AuthenticationProvider ldapAuthenticationProvider = new LDAPAuthenticationProvider();
    auth.authenticationProvider(ldapAuthenticationProvider );
 }

不过,我看到AuthenticationManagerBuilder.authenticationProvider将提供的身份验证提供程序添加到列表中!

4

1 回答 1

0

不,这不会给你想要的结果。默认的 Spring Security 实现一次只使用一个AuthenticationProvider。您的第二次调用auth.authenticationProvider()将强制 Spring Security 仅使用 LDAP 提供程序。

为了达到你想要的

第 1 步:创建一个你自己的类,比如说

public class CompositeAuthenticationProvider implements AuthenticationProvider {}

第 2 步:然后,将数据库和 LDAP 提供程序注入其中。

第 3 步:在authenticate类的方法中,CompositeAuthenticationProvider按照您认为合适的方式编排数据库和 LDAP 提供者之间的请求。根据您从两个提供商处获得的结果返回响应。

于 2014-08-16T06:25:32.583 回答