В настоящее время у меня есть один механизм аутентификации в моем приложении, который должен использовать LDAP для аутентификации и авторизации. Моя конфигурация безопасности выглядит так:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and()
.httpBasic();
}
@Configuration
protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {
@Value("${ldap-${env}.manager.dn}")
private String managerDn;
@Value("${ldap-${env}.manager.pass}")
private String managerPass;
@Value("${ldap-${env}.server.url}")
private String url;
@Value("${ldap.password.attribute:userPassword}")
private String passwordAttr;
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.ldapAuthentication().userDnPatterns("uid={0},ou=people").groupSearchBase("ou=groups")
.groupSearchFilter("(member={0})").userSearchBase("ou=people").userSearchFilter("(uid={0})")
.userDetailsContextMapper(new CustomLdapPersonContextMapper())
// .passwordCompare()
// .passwordAttribute(passwordAttr)
// .passwordEncoder(new PlaintextPasswordEncoder())
// .and()
.contextSource().managerDn(managerDn).managerPassword(managerPass).url(url);
}
}
}
Существуют ситуации, когда пользователи могут подключаться к токену сеанса, который может выполнять аутентификацию с сервера сеансовых ключей и действительный токен, возвращает имя пользователя, которое затем может использоваться для загрузки информации об аутентификации из LDAP для этого пользователя. Таким образом, мой второй механизм аутентификации должен произойти первым, когда если токен сеанса присутствует в заголовках http, он должен выполнить аутентификацию маркера, а затем поиск ldap, и если нет токена сеанса, он должен просто перейти к текущему механизму аутентификации. Как добавить этот второй уровень аутентификации.