单个应用程序中的两个身份验证服务

时间:2019-07-08 16:24:00

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

我有一个应用程序,可以根据Microsoft Active Directory对登录进行身份验证,但是现在我需要,如果用户不在组织的AD中,请尝试针对OpenLDAP目录进行身份验证,是否可以通过spring-boot进入一个应用程序?

如何在配置类中指示有两个要进行身份验证的提供程序?还是我必须使用处理程序或类似程序来执行双重身份验证?

我的代码与以下代码相似,但具有自己的过滤器和一些更改,但方案相似。 代码源:https://medium.com/@dmarko484/spring-boot-active-directory-authentication-5ea04969f220

@Configuration
@EnableWebSecurity
public class WebSecurityConfigAD extends WebSecurityConfigurerAdapter {

 @Value("${ad.domain}")
 private String AD_DOMAIN;

 @Value("${ad.url}")
 private String AD_URL;

 @Override
 protected void configure(HttpSecurity http) throws Exception {

  http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
 }

 @Override
 protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
      authManagerBuilder.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailsService());
 }

 @Bean
 public AuthenticationManager authenticationManager() {
     return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
 }
 @Bean
 public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
     ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(AD_DOMAIN, AD_URL);
     provider.setConvertSubErrorCodesToExceptions(true);
     provider.setUseAuthenticationRequestCredentials(true);
     return provider;
 }
}

2 个答案:

答案 0 :(得分:0)

我也在我的应用程序中做同样的事情:

  • 根据LDAP进行身份验证
  • 对数据库进行身份验证。

首先,LDAP服务器已经设置。 因此,在application.properties文件中,我们具有连接到LDAP服务器所需的所有信息,并具有布尔值字段以检查是否要针对LDAP服务器进行身份验证。

project.clj

将针对LDAP服务器执行身份验证的服务

project.ldap.server.protocol=
project.ldap.server.host.name=
project.ldap.server.ip=
project.ldap.server.port=
project.ldap.service.url=
project.ldap.authentication=(false/true)

现在在FacadeImplementation中,您可以执行以下操作:

@Service
public class LDAPAuthenticationConnectorService {

    @Value("${project.ldap.server.protocol}")
    private String LDAP_SERVER_PROTOCOL;

    @Value("${project.ldap.server.ip}")
    private String LDAP_SERVER_IP;

    @Value("${project.ldap.server.port}")
    private int LDAP_SERVER_PORT;

    @Value("${project.ldap.service.url}")
    private String LDAP_SERVICE_URL;

    /**
     * 
     * @param loginDto
     * @throws ADAuthenticationException
     */
    public String authenticate(LoginDto loginDto) throws ADAuthenticationException{//logic }

希望这会有所帮助:) 让我知道:)

答案 1 :(得分:0)

我找到了解决方案。

Spring Security支持多种身份验证机制。 AuthenticationManagerBuilder对象允许使用多个内置身份验证提供程序,例如内存中身份验证,LDAP身份验证,基于JDBC的身份验证。除了自己的一组身份验证模型之外,Spring Security还允许编写您的自定义身份验证机制,以针对例如安全的RESTful或SOAP远程API身份验证服务进行身份验证。

链接:https://www.baeldung.com/spring-security-multiple-auth-providers

下面的示例演示如何放置两个身份验证提供程序,一个接一个。一个:在内存中,另一个:customAuthentcationProvider。

  • auth.authenticationProvider(customAuthProvider);
  • auth.inMemoryAuthentication()

示例:

@EnableWebSecurity
public class MultipleAuthProvidersSecurityConfig extends WebSecurityConfigurerAdapter                     {
@Autowired
CustomAuthenticationProvider customAuthProvider;

@Override
public void configure(AuthenticationManagerBuilder auth) 
  throws Exception {

    auth.authenticationProvider(customAuthProvider);
    auth.inMemoryAuthentication()
        .withUser("memuser")
        .password(encoder().encode("pass"))
        .roles("USER");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic()
        .and()
        .authorizeRequests()
        .antMatchers("/api/**")
        .authenticated();
}


@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
}