Spring Security OAuth2 и аутентификация Ldap на одном ресурсе

У меня есть приложение Spring Boot 2 REST, и я хочу настроить Spring Security для поддержки входа в систему или аутентификации LDAP для тех же ресурсов (например, / сотрудников)

Я уже сделал аутентификацию через httpBasic (который подключается к LDAP-серверу Apache AD).

Также я настроил аутентификацию через Google OAuth2 Sign-In. Обе эти конфигурации работают правильно по отдельности (я могу пройти аутентификацию через Google Sign-In, но не могу одновременно с LDAP, потому что мне нужно повторно настроить безопасность Spring), и теперь мне нужна возможность аутентификации с помощью обоих этих способов. в то же время.

Конфигурация My Spring Security для аутентификации LDAP

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
            .disable()
            .authorizeRequests()
            .antMatchers("/", "/login**","/callback/", "/webjars/**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }


    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .ldapAuthoritiesPopulator(customLdapAuthoritiesPopulator)
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource()
                .url(env.getProperty("spring.ldap.urls") + env.getProperty("spring.ldap.base"))
                .and()
                .passwordCompare()
                .passwordAttribute("userPassword")
                .passwordEncoder(new LdapShaPasswordEncoder());
    }

И вот как это выглядит, когда я перенастраиваю Spring Security для входа в Google OAuth2

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
            .disable()
            .authorizeRequests()
            .antMatchers("/", "/login**","/callback/", "/webjars/**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .oauth2Login()
            .userInfoEndpoint().oidcUserService(customOAuth2UserService);
    }

Результат, который мне нужен: у пользователя есть два варианта: аутентифицироваться с помощью Oauth2 или, если он хочет, с httpBasic LDAP, независимо от того, каким способом.

Я думаю, что есть способ настроить Spring Security, чтобы OAuth2 и httpBasic LDAP работали вместе, но я не знаю, как это сделать.


person skyhook19    schedule 15.05.2019    source источник


Ответы (1)


Это возможно.

Обычная проверка подлинности использует базовую, в то время как oauth использует носитель как часть заголовка авторизации.

Мы можем использовать настраиваемый сопоставитель запросов для обнаружения базовой аутентификации и аутентификации с помощью ldap. В противном случае он будет проходить через oauth.

Во-первых, закажите WebSecurityConfigurerAdapter выше, чем сервер аутентификации Oauth,

@Configuration
@Order(2)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

Используйте наш настраиваемый сопоставитель запросов,

http
            .csrf()
            .disable()
            .requestMatcher(new BasicRequestMatcher())
            .authorizeRequests()
            .antMatchers("/", "/login**","/callback/", "/webjars/**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

Пользовательский сопоставитель запросов,

 private static class BasicRequestMatcher implements RequestMatcher {
    @Override
    public boolean matches(HttpServletRequest request) {
        String auth = request.getHeader("Authorization");
        return (auth != null && auth.startsWith("Basic"));
    }
person Srinivasan Sekar    schedule 15.05.2019