【问题标题】:Spring Data LDAP Repository finding ldap entrySpring Data LDAP Repository 查找 ldap 条目
【发布时间】:2019-12-06 00:36:04
【问题描述】:

您好,我的 LDAP 存储库有问题,特别是使用 uid 和密码查找 ldap 条目。

我正在使用 OpenLDAP

见下面的来源

LdapServiceImpl.java

@Service
public class LdapServiceImpl implements LdapService{

    private static final Logger logger = LoggerFactory.getLogger(LdapServiceImpl.class); 

    @Autowired
    UserRepository repository;

    @Override
    public boolean authenticate(String username, String password) {
        boolean ret = false;
        try {
            logger.info("{} | {}", username, password);
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] md5password = md.digest(password.getBytes(Charset.forName("UTF-8")));

           StringBuilder sb = new StringBuilder(2*md5password.length);
           for(byte b : md5password){
               sb.append(String.format("%02x", b&0xff));
           }

            logger.info("MD5 {}",sb.toString());
            User user = repository.findByUidAndPassword(username, sb.toString());
            if (user != null) {
                ret = true;
            }
        } catch (Exception e) {
            throw new LdapServiceException(e.getMessage(), e.getCause());
        } 
        return ret;
    }

    @Override
    public List<User> findAll() {
        return Lists.newArrayList(repository.findAll()); 

    }

}

Users.java(模型)

@Data
@Entry(
        base = "ou=Users",
        objectClasses = { "posixAccount", "inetOrgPerson", "top" }
)
public class User {

    @Id
    private Name id;

    @Attribute(name = "uid")
    private String uid;

    @Attribute(name = "cn")
    private String cn;

    @Attribute(name = "sn")
    private String sn;

    @Attribute(name = "givenName")
    private String givenName;

    @Attribute(name = "uidNumber")
    private long uidNumber;

    @Attribute(name = "gidNumber")
    private long gidNumber;

    @Attribute(name = "userPassword")
    private byte[] password;

    public void setPassword(String password) {
        this.password = password.getBytes(Charset.forName("UTF-8"));
    }

    public String getPassword() {
        return new String(this.password);
    }

}

UserRespository.java

public interface UserRepository extends LdapRepository<User>{

    User findByUid(String username);
    User findByUidAndPassword(String username, String password);
}

所以基本上,当调用findByUid 时,它返回一个条目,但是,当我尝试调用findByUidAndPassword 时,它为空。

请参阅LdapServiceImpl.authenticate(),了解它是如何被调用的。

我读到这个article 是关于从加密的 ldap 读取的密码值。但是,当我尝试使用 uiduserPassword 查找条目时,我无法理解。

这是我尝试执行 LdapServiceImpl.java 时得到的日志

2019-07-28 20:05:53.983  INFO 10704 --- [nio-8080-exec-1] santa.web.ldap.impl.LdapServiceImpl      : jdoe | jdoe123
2019-07-28 20:05:53.984  INFO 10704 --- [nio-8080-exec-1] santa.web.ldap.impl.LdapServiceImpl      : MD5 9c86d448e84d4ba23eb089e0b5160207

当我尝试显示findByUidfindAll 的返回时,将显示以下内容

2019-07-28 20:05:53.982  INFO 10704 --- [nio-8080-exec-1] s.web.services.rests.LoginController     : [User(id=cn=JohnDoe,ou=Users, uid=jdoe, cn=JohnDoe, sn=Doe, givenName=John, uidNumber=2000, gidNumber=100, password={MD5}nIbUSOhNS6I+sIngtRYCBw==)]

谁能告诉我为什么它在 ldap 上找不到条目?因为我不确定何时加密或不加密来自用户(rest-api)的字符串密码

【问题讨论】:

    标签: java spring ldap spring-data spring-ldap


    【解决方案1】:

    我找到了解决方案。

    显然我使用了不正确的方式来编码字符串密码。

    在 OpenLDAP 配置中,密码设置为 MD5。

    基于本指南Generating password for userPassword。它表明我必须使用 Base64 类将其编码为 md5。

    见下面LdapServiceImpl.java的片段

    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    messageDigest.update(password.getBytes(Charset.forName("UTF8")));
    byte[] digiest = messageDigest.digest();
    String hashedOutput = "{MD5}"+Base64.getEncoder().encodeToString(digiest);
    logger.info("MD5 {}",hashedOutput);
    

    我还更正了 ldaprepository 的用户模型。看来我转换错了。

    @Attribute(name = "userPassword")
    private byte[] password;
    
    public String getPassword() {
        return new String(this.password);
    }
    

    我已删除 setPassword 部分,因为它错误地转换为 byte[]

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多