Spring 4 - 使用preAuthorize& PostAuthorize

时间:2014-08-15 17:18:38

标签: java spring spring-mvc authentication spring-4

注意:我的应用程序使用最新版本的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添加到列表中!

1 个答案:

答案 0 :(得分:0)

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

实现你想要的目标

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

public class CompositeAuthenticationProvider implements AuthenticationProvider {}

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

第3步:在类authenticate的{​​{1}}方法中,根据需要在数据库和LDAP提供程序之间编排请求。根据您从两个提供商处获得的结果返回响应。