java - 为什么我们在使用 ContextMapper 时不必为 ldap 用户指定对象类?

标签 java spring ldap spring-ldap

请耐心等待,因为我是 Spring 和 ldap 的新手。

如果我想将用户从 ldap 服务器映射到 Person java 对象,来自 ldap 服务器的查询是否包含对象类有关系吗?

我的理解是,对象类可以是 ldap 预定义的对象类,例如“person”、“organizationalPerson”、“inetOrgPerson”等。Ldap 还可以保存自定义定义的对象类。如果定义了objectclass=person,则保证“cn”、“sn”将被定义,依此类推。

修改如下sample code应该将 ldap 属性映射到 java Person 对象:

 private static class PersonContextMapper
         implements ContextMapper {
      public Object mapFromContext(Object ctx) {
         DirContextAdapter context = (DirContextAdapter)ctx;
         Person p = new Person();

         if (context.getStringAttribute("cn") != null)
               p.setFullName(context.getStringAttribute("cn"));

         if (context.getStringAtribute("sn") != null)
               p.setLastName(context.getStringAttribute("sn"));

         return p;
      }
   }

这里,它没有引用 objectclass=person,但它会查找属性,就好像 objectclass=person 确实已设置一样。如果此 ldap 目录中的用户也是 objectclass=CustomPerson 的一部分,其中定义了属性“goals”、“salary”怎么办?

那么,在不知道这个用户是否也是objectclass=CustomPerson的情况下,是不是就像添加一个检查一样简单:

if (context.getStringAttribute("goals") != null) 
     p.setGoals(context.getStringAttribute("goals"));

或者,如果该用户只是 objectclass=CustomPerson 的一部分而不是 objectclass=person 的一部分,该怎么办?那么,查找“cn”和“sn”就没有意义了,因为只定义了“目标”和“薪水”?

我是否遗漏了一些东西,或者只是假设用户属性已经提前知道,因此我们可以在 ldap 用户和 java Person 对象之间的映射中进行硬编码?

最佳答案

Java 代码不需要知道 LDAP 对象类。它只是获取属性。 LDAP 对象要么具有这些属性,在这种情况下您将获得它们,要么它不具有这些属性,在这种情况下您将获得异常。

关于java - 为什么我们在使用 ContextMapper 时不必为 ldap 用户指定对象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312849/

相关文章:

java - Java 中使用循环的 Switch 语句

java - 将url参数转发给CAS

Java 8 到 Java 11 : package com. sun.jndi.ldap 不可见

apache - MediaWiki 上的 LDAP 身份验证

java - 如何使用 LDAP 限制登录尝试

javascript - 如何隐藏地址栏中的Url?

java - Android Mysql从表中获取特定数据

Java 如何写入并行端口(Windows 7)-代码不起作用

spring - 如何在 intellij idea 中更快地调试 Spring Boot gradle 项目?

spring - 如何正确地将 Spring 包含到 OSGified 包中