我正在开发一个Springboot应用程序,它需要在本地(通过基于DAO的提供程序)和多个LDAP服务器(管理配置,存储在数据库中)支持身份验证。
使用单个LDAP提供程序,我的configure方法如下所示:
select * from word_detail w left join roots r
on r.root_text =w.root
where w.surah_no=1
and w.verse_no=1
and w.word_no=1
通过其他类似帖子看来,这可以通过创建多个LDAP提供程序来完成,Spring安全性将循环遍历每个提供程序,直到找到成功登录。我在User表上将关联的LDAP配置记录关联为外键。
是否有更有效的方法来尝试与用户关联的特定LDAP端点,或者最好让Spring迭代可用的提供程序?
感谢您的任何意见!
答案 0 :(得分:0)
经过长时间的搜索,我发现了有关Spring Security身份验证工作原理的一些有趣信息(有一个视频:https://youtu.be/caCJAJC41Rk?t=781)
之后,您可以使用Spring实现的系统,该系统将覆盖supports(class<?> authenticationClass)
方法。此方法用作“ AuthenticationProvider,您可以管理这种AuthenticationClass吗?”如果为true,则提供程序将尝试对用户进行身份验证,否则,将不执行任何任务。
通过这种方式,您可以实现自己的CustomAuthentificationProvider
,该{@ 1}}实现AuthenticationProvider
接口。
public class LocalUserAuthenticationProvider implements AuthenticationProvider {
private final UserRepository;
public LocalUserAuthenticationProvider(UserRepository userRepository){
this.userRepository = userRepository;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
/*my jobs*/
throws new AuthenticationException("Cannot authenticate");
}
@Override
public boolean supports(Class<?> aClass) {
return MyUsernameAuthenticationToken.class.isAssignableFrom(aClass);
}
}
使用您自己的AuthenticationToken
public class StringUsernameAuthenticationToken extends UsernamePasswordAuthenticationToken {
public StringUsernameAuthenticationToken(Object principal, Object credentials) {
super(principal, credentials);
}
public StringUsernameAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
super(principal, credentials, authorities);
}
}
实际上,我在Spring Security实现的AuthenticationManagerBuilder中找不到任何使用LDAP身份验证的解决方案(参考:https://spring.io/guides/gs/authenticating-ldap/)
希望这可以帮助人们