【发布时间】: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 读取的密码值。但是,当我尝试使用 uid 和 userPassword 查找条目时,我无法理解。
这是我尝试执行 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
当我尝试显示findByUid 或findAll 的返回时,将显示以下内容
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