Spring Security OAuth2 и Ldap аутентификация в одном ресурсе - PullRequest
0 голосов
/ 15 мая 2019

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

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

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

Конфигурация 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 работали вместе, но я не знаю, как это сделать.

1 Ответ

0 голосов
/ 15 мая 2019

Возможно.

Базовая аутентификация использует базовую, где в качестве 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"));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...