【发布时间】:2017-09-28 03:16:24
【问题描述】:
我有一个绑定 LDAP 连接的服务帐户,我正在使用 JAAS LdapLoginModule 来验证该帐户。一旦LDAP绑定成功,我需要搜索或验证或搜索其他普通用户的用户名和密码。
所以我应该如何处理,因为我没有找到任何带有用户密码的搜索查询,并且这个普通用户不允许 LDAP 绑定权限。我能够检索其中的所有组和用户,但我找不到密码。
【问题讨论】:
我有一个绑定 LDAP 连接的服务帐户,我正在使用 JAAS LdapLoginModule 来验证该帐户。一旦LDAP绑定成功,我需要搜索或验证或搜索其他普通用户的用户名和密码。
所以我应该如何处理,因为我没有找到任何带有用户密码的搜索查询,并且这个普通用户不允许 LDAP 绑定权限。我能够检索其中的所有组和用户,但我找不到密码。
【问题讨论】:
LDAP 目录以“正常”方式将其用作身份验证提供程序,不允许任何用户读取密码属性以避免泄漏。
通常的做法是只允许任何人对该属性进行身份验证,即:任何人都可以使用该属性来尝试绑定操作。
所以有两种处理你的案子的方法:
编辑:在评论中回答问题:
正如我之前所说,要比较和/或读取(如在协议的 LDAP 操作中)另一个用户的密码属性而不是您的主帐户,您必须允许主帐户执行此操作,但不建议这样做.
如何允许,这取决于您使用的 LDAP 实现(即哪个目录:OpenLDAP、AD、ApacheDS 等)
或者您允许每个人在目录上绑定,这是执行此操作的标准方式:
【讨论】:
we can give bind permission to only Master user for security purpose :关于这一点,我完全不同意。授予您的主帐户对所有密码的读取权限比授权任何人尝试绑定并且无法读取任何人的密码内容要危险得多
你需要:
如果这一切都成功,那么用户属性和密码是正确的。如果没有,就没有。
【讨论】:
如果您只想在没有任何授权的情况下使用 JAAS 进行身份验证,那么在安全原则中不要使用完整的 DN,只需传递如下用户名即可。它将获得身份验证但未授权
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.PROVIDER_URL, providerUrl);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "admin");
env.put(Context.SECURITY_CREDENTIALS, "passWord");
像这样,如果你想要授权,那么还有其他方法
【讨论】: