gpt4 book ai didi

java - Spring Data LDAP 存储库查找 ldap 条目

转载 作者:行者123 更新时间:2023-12-02 02:29:03 25 4
gpt4 key购买 nike

您好,我在 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)

最佳答案

我找到了解决方案。

显然我使用了错误的方法来编码字符串密码。

在 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[]

希望这有帮助

关于java - Spring Data LDAP 存储库查找 ldap 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57240815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com