Spring Security:针对多个LDAP服务器进行身份验证&基于DAO的身份验证

时间:2015-11-29 20:51:31

标签: spring spring-mvc authentication spring-security spring-ldap

我正在开发一个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迭代可用的提供程序?

感谢您的任何意见!

1 个答案:

答案 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/

希望这可以帮助人们