【问题标题】:LDAP compare username password?LDAP比较用户名密码?
【发布时间】:2013-08-24 19:36:21
【问题描述】:

我是 LDAP 新手,正在使用 com.sun.jndi.ldap jar。

我有一个登录页面,用户在其中输入用户名和密码。我的工作是使用 LDAP 中的数据验证凭据。

到目前为止,我已经连接到 LDAP 服务器,验证并检索了 uid。

现在我想比较用户输入的密码和 LDAP 中的密码(密码是私有的,即在查询用户 ID 时无法查看)。

有没有办法比较这两个密码?

【问题讨论】:

  • 嗨,你得到解决方案了吗,实际上我也在寻找同样的方法,但在互联网上没有找到任何东西

标签: java ldap


【解决方案1】:

我们有几个以用户身份使用绑定的示例。你应该被别人提到,做一个绑定,永远不要比较密码。密码比较是一种不好的做法,不应使用,因为在对密码属性执行比较请求时,可能会绕过一些内置的 LDAP 服务器实现功能,例如密码过期和入侵者检测。

JNDI Samples

【讨论】:

    【解决方案2】:

    Java LDAP API 提供search 操作,依次导致LDAP 比较。这里是an example of the same

    【讨论】:

      【解决方案3】:

      如果在您的应用程序中可以选择使用 Spring Security,那么它有一个模块可以让您将身份验证与 LDAP 集成。

      Documentation here

      【讨论】:

      • 嘿大卫,非常感谢您的快速回复,但我能够成功地验证和检索信息。现在我正在寻找类似 ldap_compare [Its a php method] 的方法,它可以与 Core Java 和 Jndi ldap lib 一起使用
      【解决方案4】:

      如果你真的想比较一个字段(不限于用户名和密码),你可以在search方法上使用下面的wrapper

      public boolean compare(LdapContext ctx, String dn, String filter) {
      
          NamingEnumeration<SearchResult> answer = null;
      
          try {
              SearchControls searchCtls = new SearchControls();
              searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
              searchCtls.setReturningAttributes(new String[0]);
      
              answer = ctx.search(dn, filter, searchCtls);
              if (answer == null || !answer.hasMore()) {              
                  return false;   // E.g.: wrong filter
              }
          } catch (NamingException ex) {
              return false;       // E.g.: wrong DN
          }
          return true;
      }
      

      ctx 可能在哪里:

      LdapContext ctx = new InitialLdapContext(getEnvironment(userName, password), null);
      

      getEnvironment 方法可以是:

      private Hashtable<String, Object> getEnvironment(String userName, String password) {
          Hashtable<String, Object> env = new Hashtable<>();
          env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
          env.put(Context.PROVIDER_URL, LDAP_HOST_389);
          env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
          env.put(Context.SECURITY_PRINCIPAL, userName);
          env.put(Context.SECURITY_CREDENTIALS, password);
          return env;
      }
      

      如果你调用上面的compare方法,你会得到:

      • false 如果出现问题(例如:无效dn,无效filter
      • true 否则。在这种情况下,如果您在 compare 方法中检查 answer,您将看到:

        SearchResult sr = answer.next();
        sr.getName();                      // this is empty
        sr.getAttributes();                // No attributes
        

      你也可以看看LDAP Compare documentation from Oracle

      【讨论】:

        【解决方案5】:

        你问错问题了。使用 LDAP 的正确方法是使用用户的凭据而不是您自己的凭据“绑定”到目录。在 JNDI 中,这对应于 LdapContext.reconnect() 操作,在将用户的凭据设置为上下文环境后,Context.SECURITY_PRINCIPALContext.SECURITY_CREDENTIALS. 这会导致 LDAP 服务器根据需要进行密码比较。

        【讨论】:

        • 感谢您的回复。你能给我一些示例代码吗?我无法对用户密码使用“绑定”。
        • 定义“无法”。我已经告诉过你要使用什么 API。有什么问题?
        • 绑定操作在某些系统上可以是登录。比较密码功能应该足以检查密码和用户名。
        • @musiKk 目录配置可能不允许访问其他人的密码。我的就是这么配置的。如果您认为有一个用于密码验证的远程比较功能,您需要说明它是什么,如果您认为绑定比使用远程比较“不太正确”,您需要说明原因。
        • @musiKk 你说,我引用,'更不用说正确的',你仍然错了。它正确的。做绑定是正确的;获取密码并自己进行比较不是。一方面,后者需要重现服务器的密码哈希算法。
        【解决方案6】:

        如果我理解正确,您正在尝试比较用户输入的密码和 Java 代码中 LDAP 中的密码。这在 JAVA 中是不可能的,因为 java 没有从 LDAP 检索密码的选项。我们只能要求 LDAP 验证用户输入的详细信息。此外,LDAP中的密码不会以纯文本形式存储,而是会被加密存储。

        【讨论】:

        • 但是应该有一些方法可以用存储在 LDAP 中的密码来验证我的密码(我会负责加密)
        • 您确实可以收到密码,尽管是散列形式。密码在 LDAP 中没有加密,它们是经过哈希处理的。
        • @Warlock,这既不是 LDAP 也不是 Java 问题。我要说的可能不适用于您的环境,但在这里。根据目录软件及其配置,如果 LDAP 绑定尚未与特权主体/DN(例如目录管理员 ID/DN(例如,cn=root、 cn=admin,你有什么)。如果应用程序未托管在受保护和安全的环境中并且 [续],则在应用程序中使用目录管理员权限可能不是一个好主意
        • 它确保了对管理员凭据的保护。当您与用户的主体 (DN) 和凭据(密码)绑定时,目录软件已经为您进行了比较。如果比较结果为假,则“已验证”绑定不成功(您将在代码中收到异常)。这告诉您用户发送的密码与存储在服务器中的密码不匹配。不匹配也可能由撤销/无效的密码引起;这取决于目录服务器如何处理用户密码属性 [续]
        • (例如,密码策略功能可能正在控制绑定和密码)。假设您使用的是这样做的,您应该将散列/加密留给您的目录服务器。
        猜你喜欢
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        相关资源
        最近更新 更多