我有一个应用程序,可以根据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;
}
}
答案 0 :(得分:0)
我也在我的应用程序中做同样的事情:
首先,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。
示例:
@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();
}
}