我对在基于 Java 的 Web 应用程序中使用 LDAP 身份验证的最佳实践感兴趣。在我的应用程序中,我不想存储用户名\密码,只存储一些 id。但是,如果 LDAP 目录中存在任何附加信息(姓名、姓氏),我想检索它。
4 回答
我的团队使用 LDAP 作为一种标准的身份验证方式。基本上,我们将 LDAP 视为任何其他数据库。
要将用户添加到应用程序,您必须从 LDAP 中选择一个或在 LDAP 中创建它;当用户从应用程序中删除时,它会保留在 LDAP 中,但无法访问应用程序。
您基本上只需要在本地存储 LDAP 用户名。您可以每次都从 LDAP 读取 LDAP 数据(电子邮件、部门等),或者以某种方式将其拉入应用程序,尽管从 LDAP 读取数据可能更简单、更智能,因为 LDAP 数据可以更改。当然,如果您需要报告或广泛使用 LDAP 数据,您可能希望从 LDAP 中提取它(手动或使用批处理任务)。
好消息是一旦用户在 LDAP 中被禁用,它会同时在所有应用程序中被禁用;此外,用户在所有应用程序中都具有相同的凭据。在企业环境中,有一堆内部应用程序,这是一个主要优点。不要只为一个应用程序的用户使用 LDAP;在那种情况下没有真正的好处。
有关 LDAP 的一般最佳实践,请参阅“LDAP:编程实践”。
如果您有多个基于 Web 的应用程序并希望使用 LDAP 身份验证,那么预打包的单点登录解决方案可能比创建自己的 LDAP 身份验证更好。CAS支持 LDAP 身份验证,可以拉回应用程序所需的数据。
在我的大学里,我们实际上已经将 CAS 实现为针对我们的 Active Directory 服务器的单点登录。我们还利用 CAS 来验证我们的 J2EE 应用程序,并且正在努力使用 CAS 来验证我们的 PHP 应用程序。
我们使用 AD 来保存域的用户。根据用户类型,有特定的 OU。每个用户都有一个唯一的 ID,恰好是他们的学生/员工 ID,因此应用程序可以将其用作其数据库中的主键。我们的 PHP 应用程序有一个数据库驱动的授权方法。J2EE 应用程序的授权来自 LDAP 中的一个值。
祝你的申请好运。
那么,您希望用户只输入 ID,然后从 LDAP 中获取其余信息吗?这很容易。
- 创建 LdapInitial 上下文并连接到 LDAP
- 搜索 ID(它应该存储为某个属性值)——例如 (&(userid=john)(objectClass=user))——这意味着“userid=john AND objectClass=user”
- SearchResult 对象将包含所有属性(或您询问的属性)
一些 LDAP 实现(著名的 MS ActiveDirectory LDAP)不允许您与匿名用户连接。对于那些您需要有技术用户名/密码才能连接的用户。
如上所述,当您有许多应用程序时,LDAP 通常是有意义的。
PS 要感受 LDAP 是什么,请尝试 Apache Directory Studio。