@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;
}
}
上面的例子对我使用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);
}
}
2条答案
按热度按时间8oomwypt1#
这里有一个解决方案,我已经提出并测试。
本课程中的以下信息值得特别注意:ReactiveAuthenticationManagerAdapter。在那里,它声明:
使AuthenticationManager适应React式API。这在某种程度上是必要的,因为许多存储凭据的方式(即JDBC、LDAP等)都没有React式实现。此外,通常认为最佳做法是将密码存储在故意放慢速度的哈希中,这将阻止任何请求进入,除非将其放在另一个线程上。
首先,创建一个配置类,它将处理与LDAP的连接。
然后,你需要按照下面的模式来配置你的安全性。最基本的链配置是这样的:
为了完整起见,您需要确保您拥有以下内容:
型
其他参考资料
nszi6y052#
上面的例子对我使用Windows Active Directory不起作用,我可以让LDAP认证在独立(非Spring)Java中工作,但上面的解决方案总是给我错误52e(用户已知,但密码无效)。
根据上面的例子,我使用了相同的
pom.xml
和@EnableWebFluxSecurity
...SecurityWebFilterChain(...)
,但是使用了以下代码:为了返回已登录的用户,可以使用如下代码: