实现 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 的其他请求).