Spring Security WebFlux и LDAP - PullRequest
0 голосов
/ 24 мая 2018

Какие настройки необходимы для защиты приложения Reactive Spring Boot с LDAP?Примеры, которые я видел до сих пор, основаны на Spring MVC, а пример для защиты WebFlux показывает только простой Reactive пример с картой в памяти.

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

Приведенный выше пример не работает для меня при использовании Windows Active Directory.Я мог заставить Аутентификацию LDAP работать в автономной (не Spring) Java, но вышеупомянутое решение всегда давало мне ошибку 52e (пользователь известен, но неверный пароль).

Следуя примеру выше, яиспользовал те же pom.xml и @EnableWebFluxSecurity ... SecurityWebFilterChain(...), но со следующим:

@Configuration
public class ReactiveLdapAuthenticatoinConfig {

@Bean
ReactiveAuthenticationManager authenticationManager() {

   ActiveDirectoryLdapAuthenticationProvider adlap = 
      new ActiveDirectoryLdapAuthenticationProvider(
         "{my.domain}",
         "ldap://{my.ldap.server}.{my.domain}"
      );

   AuthenticationManager am = new ProviderManager(Arrays.asList(adlap));
   return new ReactiveAuthenticationManagerAdapter(am);
}
}

Чтобы вернуть зарегистрированного пользователя, нужно использовать что-то вроде:

@GetMapping(value = '/user')
public Mono<String> getUser(Mono<Principal> principal) {
   return principal.map(Principal::getName);
}
0 голосов
/ 11 августа 2018

Вот одно решение для этого, которое я придумал и протестировал.

Заслуживает особого внимания эта информация в этом классе: ReactiveAuthenticationManagerAdapter .Там говорится:

Адаптирует AuthenticationManager к реактивным API.Это в некоторой степени необходимо, поскольку многие способы хранения учетных данных (например, JDBC, LDAP и т. Д.) Не имеют реактивных реализаций.Более того, как правило, рекомендуется хранить пароли в намеренно медленном хеше, который блокировал бы поступление любого запроса, если он не был помещен в другой поток.

Сначала создайте класс конфигурации,Это будет обрабатывать подключение к LDAP.

@Configuration
public class ReactiveLdapAuthenticationConfig {

    // Set this in your application.properties, or hardcode if you want.
    @Value("${spring.ldap.urls}")
    private String ldapUrl;

    @Bean
    ReactiveAuthenticationManager authenticationManager(BaseLdapPathContextSource contextSource) {

        BindAuthenticator ba = new BindAuthenticator(contextSource);
        ba.setUserDnPatterns(new String[] { "cn={0},ou=people" } );

        LdapAuthenticationProvider lap = new LdapAuthenticationProvider(ba);

        AuthenticationManager am = new ProviderManager(Arrays.asList(lap));

        return new ReactiveAuthenticationManagerAdapter(am);

    }

    @Bean
    BaseLdapPathContextSource contextSource() {
        LdapContextSource ctx = new LdapContextSource();
        ctx.setUrl(ldapUrl);
        ctx.afterPropertiesSet();
        return ctx;
    }

}

После этого вы захотите настроить свою безопасность, следуя шаблонам здесь .Самая базовая конфигурация цепочки заключается в следующем:

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http
        .authorizeExchange()
            .anyExchange().authenticated()
            .and()
        .httpBasic();

    return http.build();
}

Для полноты картины вы должны убедиться, что у вас есть следующие данные:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-ldap</artifactId>
</dependency>

Другие ссылки

...