Поиск записей LDAP изнутри LdapAuthoritiesPopulator

Я использую 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;
    }
}

person imgx64    schedule 05.08.2014    source источник


Ответы (1)


Вам не нужны роли, заполненные до запуска приложения (я полагаю). Таким образом, одна вещь, которая сработает, — это ввести ApplicationContext вместо ContextSource и лениво искать последний. Если это сработает, может быть грузовик с @Lazy.

person Dave Syer    schedule 06.08.2014