实现 LDAP 服务器端¶
LDAP 也就是轻型目录访问协议 (Lightweight Directory Access Protocol) 在开发企业内部服务与互联网程序共享用户、系统、网络、服务和应用的过程中占据了重要地位。 例如,目录服务可能提供了组织有序的记录集合,通常有层级结构,例如公司电子邮件目录。同理,也可以提供包含了地址和电话号码的电话簿。
LDAP的一个常用用途是单点登录,用户可以在多个服务中使用同一个密码,通常用于公司内部网站的登录中(这样他们可以在公司电脑上登录一次,便可以自动在公司内部网上登录)。
LDAP目录条目还可以描述一个层次结构,这个结构可以反映一个组织的上下级关系。
备注
除了作为单点登录服务的数据源,我很怀疑还有企业把 LDAP 服务用作其他用途。
PS: 应该还有用作电话簿以及电子邮件目录的。
为什么需要支持 LDAP 协议 ?¶
LDAP 认证一般被认为是 企业级 特性,市面上几乎所有的商业软件(例如: kibana, grafana 等等)都支持这个协议。
备注
当然这需要您付额外的授权费用, 毕竟用的是 企业版 .
备注
如果问为什么 LDAP 这么流行,这只能说是 微软 的厉害之处。
因为如果要实现一个 可以兼容几乎所有商业软件 认证服务器,实现 LDAP 服务端是绕不过去的。
提示
现在我们有了 更好 , 更多 的单点登录以及授权协议。
例如: OAuth2.0, OpenID 等
LDAP 客户端¶
基本上所有的语言都有作为 LDAP 客户端的库.
备注
客户端不在今天讨论的范围之内.
LDAP 服务端¶
LDAP 服务器简单来说就是一种树状结构的数据库。
提示
大多数开发人员都应该使用过关系数据库, 现在当大家说 数据库 的时候如果不加限制默认也都为 关系数据库。
实际上还有多种类型的数据库,例如: 图数据库、时序数据库 等等
要实现最简单的 LDAP SSO 服务器端, 只需要处理 LDAP 协议中的:
BIND Request (认证请求)
用于用户认证,判断账号、密码是否匹配
Search Request (搜索请求)
用户获取用户的信息(Profile 个人资料 以及 Group 分组)
具体实现¶
因为 用户中心 本身由 Python 语言编写, 所以最终选择了: ldaptor 库作为 LDAP 服务器端的基础框架。
因为目标是作为单点登录的数据源, 因此我们仅需要实现 BIND 请求 和 搜索 请求(不支持 LDAP 的其他请求).