Java - LDAP:为啥我们需要硬编码的管理员用户凭据来进行 LDAP 绑定

Posted

技术标签:

【中文标题】Java - LDAP:为啥我们需要硬编码的管理员用户凭据来进行 LDAP 绑定【英文标题】:Java - LDAP: Why do we need hardcoded Admin user credentials for LDAP bindingJava - LDAP:为什么我们需要硬编码的管理员用户凭据来进行 LDAP 绑定 【发布时间】:2018-08-09 19:54:50 【问题描述】:

我正在编写一个 Spring Boot 应用程序,我想针对 LDAP 服务器对用户进行身份验证。我已经看到了解决方案和API documentation,其中 Admin Users 凭据被硬编码在代码中。

我的问题是:为什么我不能简单地使用我首先尝试进行身份验证的用户的凭据?如果绑定成功,我可以确认身份验证并获取它们所属的组列表。我不应该这样做有什么好的理由吗?

【问题讨论】:

创建/更新用户、重置用户密码等可能需要管理员凭据。针对现有用户进行身份验证不需要管理员凭据。很可能,LDAP 连接(池)在用户维护和现有用户身份验证之间共享,因此所有连接都具有管理员凭据,即使在不需要时也是如此。 【参考方案1】:

LDAP 示例通常包含管理员用户的原因是因为 LDAP 并不总是用于身份验证(即确定特定用户名/密码是否有效),但有时仅用于授权(即检索用户分配的组,以确定他们是否应该有权访问受保护的资源),当身份验证部分在其他地方完成时(例如,通过 Kerberos SSO)。如果您唯一的用例是绑定,那么是的,您不需要管理员用户。

编辑:有一点需要注意 - LDAP 服务器可能对绑定有限制(例如,请参阅 this question),在这种情况下,无论如何您都需要一个管理员用户。

【讨论】:

【参考方案2】:

通常您希望拥有一个特定于应用程序的服务帐户:

    执行绑定 查找用户 返回用户的组成员身份 应用程序根据结果授权用户

这有助于管理权威后端的访问控制,因为您只需为服务帐户而不是每个单独的用户创建 ACI。它也更安全,因为您将权限授予单个帐户,从而降低了错误配置单个用户权限的可能性。

【讨论】:

以上是关于Java - LDAP:为啥我们需要硬编码的管理员用户凭据来进行 LDAP 绑定的主要内容,如果未能解决你的问题,请参考以下文章

登录表单用户凭据而不是 LDAP Spring Security 中的硬编码 UserDn 和密码

使用LDAP WITHOUT servername从Java(Linux)到Active Directory进行身份验证

为啥使用带有硬编码种子的 Random 总是产生相同的结果? [复制]

为啥库需要硬编码矢量化而不是编译器自动矢量化

springboot通用分支处理---还在硬编码特殊处理逻辑?超级管理员不应该被区别对待

为啥 Oracle ADD_MONTHS() 返回的 sysdate 值与我硬编码今天的日期不同?