Spring LDAP 登录验证(非查询方式)

最近公司的一个产品需要做兼容多个公司的LDAP登录功能,选择Spring LDAP这种比较简单的方式来获取LDAP连接和查询用户,但是做到用户登录时却发现了一个问题,不同公司的LDAP的密码加密方式可能并不一样,若想通过查询的方式来确认用户登录,则需要关心该LDAP的密码加密方式。

但是我们并不想把所有的可用加密方式列举一遍,那有其他的方法来实现这个功能么?在你连接LDAP的时候会发现,你的管理员密码并没有做任何处理,但是连接依然成功,而Spring LDAP还提供了一个用户验证接口,其实就是调用了LDAP提供的登录接口,和你管理员登录连接LDAP是一个原理,那么我们可不可以利用这个接口来验证登录呢?

这里存在一个问题,LDAP的登录接口需要精确地base,但是每个用户的base可能都不尽相同,比如ou=研发部,或者ou=运营部。如此一来我们需要动态的获取用户的精确base,下面上代码,可能不够完善,但是对于部分公司的LDAP还是可以解决这种登录问题的:

public Boolean loginLdap(LDAPInfo ldapInfo, String name, String password){
  //首先,要根据用户名称做一次查询,以确定用户的精确路径
    AndFilter filter = new AndFilter();
    filter.and(new EqualsFilter("objectClass", ldapInfo.getObjectClass()));
    if (!StringUtils.isEmpty(name)) {
      filter.and(new EqualsFilter(ldapInfo.getUserName(), name));
    }

    try {
    //这个方法可以查询出该用户的全路径
      String fullBase=ldapConfiguration.ldapTemplate().searchForContext(LdapQueryBuilder.query().filter(filter)).getNameInNamespace();
    //去除掉之前连接LDAP参数中的base和userDN,应该就是你想要的路径
      fullBase=fullBase.replace(ldapInfo.getBaseDn(),"");
    //这里一般是uid字段
      fullBase=fullBase.replace(ldapInfo.getUserId()+"="+name,"");
      fullBase=fullBase.replaceAll(",","");
     Boolean a= ldapConfiguration.ldapTemplate().authenticate(fullBase,filter.encode(),password);
      return a;
    }catch (RuntimeException e){
      return false;
    }
  }

这里需要注意的是,你的登录名最好的唯一的,否则你需要循环匹配账户密码,来确定登录用户。
自己摸索的方式,不知道通用性如何,在做个记录,欢迎大家指正

你可能感兴趣的:(Spring LDAP 登录验证(非查询方式))