Я использую Spring Security и spring-security-ldap
для аутентификации в приложении Spring Boot.
Я хочу реализовать LdapAuthoritiesPopulator
, который ищет некоторые записи с сервера LDAP, чтобы определить роли пользователя. Эти записи не принадлежат пользователю, поэтому объекта userData
, предоставленного методу getGrantedAuthorities
, недостаточно. (У меня нет контроля над сервером LDAP, поэтому я не могу добавлять роли в записи пользователей).
Я подумал о внедрении ContextSource
, который Spring Security создает при вызове auth.ldapAuthentication().contextSource()
(см. (1) в приведенном ниже коде), в файл LdapAuthoritiesPopulator
. Но это не работает, потому что LdapAuthoritiesPopulator
создается до WebSecurityConfigurerAdapter
, поэтому ContextSource
еще не существует.
Мой WebSecurityConfigurerAdapter
содержит следующий метод:
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.ldapAuthentication()
.contextSource() // (1)
.url("ldap://example.org/o=organization")
.and()
.ldapAuthoritiesPopulator(ldapAuthoritiesPopulator)
.userSearchFilter("uid={0}");
}
ldapAuthoritiesPopulator
подключается автоматически, класс в настоящее время является фиктивной реализацией, которая просто добавляет ROLE_USER
:
@Component
public class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {
@Override
public Collection<? extends GrantedAuthority> getGrantedAuthorities(
DirContextOperations userData, String username) {
// I want to look up some entries in LDAP here, so I need a ContextSource
// but I can't inject it because it does not exist when this bean is created
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("USER"));
return authorities;
}
}