Spring安全WebFlux和LDAP

oyxsuwqo  于 2022-12-18  发布在  Spring
关注(0)|答案(2)|浏览(177)

为了使用LDAP保护Reactive Sping Boot 应用程序,需要进行哪些定制?到目前为止,我看到的示例都是基于Spring MVC的,而保护WebFlux的示例只显示了一个简单的Reactive示例,其中包含内存中的Map。

8oomwypt

8oomwypt1#

这里有一个解决方案,我已经提出并测试。
本课程中的以下信息值得特别注意:ReactiveAuthenticationManagerAdapter。在那里,它声明:
使AuthenticationManager适应React式API。这在某种程度上是必要的,因为许多存储凭据的方式(即JDBC、LDAP等)都没有React式实现。此外,通常认为最佳做法是将密码存储在故意放慢速度的哈希中,这将阻止任何请求进入,除非将其放在另一个线程上。
首先,创建一个配置类,它将处理与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>

其他参考资料

nszi6y05

nszi6y052#

上面的例子对我使用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);
}

相关问题