注意:我的应用程序使用最新版本的Spring框架4.0.6,3.2.4来保证安全性,并且它不使用xml而只使用Java-Config来配置应用程序。
我有一组服务,我希望通过角色和其他特定于业务的授权条件来保护这些服务。此服务分组为一个模块(jar),由REST应用程序和Web应用程序使用。我已经在Web应用程序中有AuthenticationProvider
(REST应用程序处于初始阶段)。我在Web应用程序中使用@EnableGlobalMethodSecurity
。话虽如此,我现在也需要保护服务中的方法。在这种情况下,我是否需要提供另一个身份验证提供程序?或者,将身份验证提供程序移动到服务模块是否正确,以便Web / rest应用程序使用服务jar中的身份验证提供程序?如果我在服务模块的ApplicationServiceConfig.java中配置@EnableGlobalMethodSecurity
,我会得到打击例外。
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
将提供的authenticationprovider添加到列表中!
答案 0 :(得分:0)
不,这不会给你想要的结果。默认的Spring Security实现一次只使用一个AuthenticationProvider
。您对auth.authenticationProvider()
的第二次调用将迫使Spring Security仅使用LDAP提供程序。
实现你想要的目标
第1步:创建一个属于您自己的类,比如说
public class CompositeAuthenticationProvider implements AuthenticationProvider {}
第2步:然后,将数据库和LDAP提供程序注入其中。
第3步:在类authenticate
的{{1}}方法中,根据需要在数据库和LDAP提供程序之间编排请求。根据您从两个提供商处获得的结果返回响应。