WordPress & AList 的 LDAP 登录(通过 Active Directory)折腾记

数个月前,因为终于受不了 Halo 的速度和资源消耗,并且扩展性和功能都挺弱鸡的。好在沉没成本不高(只是买了一个 SEO 插件)果断跳车重回 WordPress。

令人头疼的是,WordPress 的友情链接此前都是给每个交换友链站长一个账号自行管理的,但现在账号数据都没有了,同时还增加了一个 AList 程序接 OneDrive 365。需要注册账号的地方越来越多,需要一个集中管理的地方。

基于 OAuth2 的鉴权曾经尝试过,但体验很差。唯一 UI 还凑合的 Casdoor 更是鉴权界的牛皮癣并且非常不注重安全,因此这次决定来看看另一个广受支持的 LDAP。

LDAP Server / Active Directory

在 Synology DiskStation 上,有两个套件提供 LDAP 服务。分别是 LDAP Server 和 Synology Directory Server。后者提供微软的 Active Directory (也就是 AD 域)服务。

AD 完全兼容 LDAP,尽管 AD 更复杂更沉重,但好在 Synology 的套件上手非常简单易用,配置也是傻瓜式的,同时 AD 域的功能更多,因此我选择了 AD 域。

配置 AD 域

安装 Synology Directory Server,填写域名并创建域控制器。完成后如下图所示。

AD 域界面

记录一下 DC 部分的内容,这部分就是我们的 LDAP Base DN:

DC=CYRENE,DC=GHOSTCHU,DC=COM

其实也就是域名的反写。

转到“用户和计算机”,创建一个组织单元(OU),这里我叫它 BarbatosClub

紧随其后在新创建的 BarbatosClub 组织单元内创建一个用户账号,也是我们的超级管理员账号,设置一个足够复杂的密码(因为权限相当高),并为其勾选密码永不过期。这里的超级管理员账号叫做 Cyrene

转到 “加入群组” 选项卡,加入除了 Guests 组外的全部组,确定保存,为其授予全部权限。

网络配置

防火墙放行 LDAPS 636 端口,允许外部访问。由于群晖套件的 AD 因安全策略原因,实际上是不允许 389 无加密访问的,因此我们只放行 SSL 的 LDAP 端口即可。

连接到 AList LDAP

Ldap 服务器填写 ldaps://服务器IP:636.

Ldap 管理器 dn 填写 CN=Cyrene,OU=BarbatosClub,DC=cyrene,DC=ghostchu,DC=com

其中 DC=cyrene,DC=ghostchu,DC=com 是我们上面提到的 Base DN,CN=Cyrene,OU=BarbatosClub 指的是刚刚我们创建的 BarbatosClub 组织单元里面的 Cyrene 超级管理员账号。

Ldap 管理员密码填写 Cyrene 超级管理员账号的密码即可。

Ldap 用户搜索基础指的是哪个范围内的用户可以登录我们的系统。

例如,OU=BarbatosClub,DC=cyrene,DC=ghostchu,DC=com 就是只有我们刚刚创建的 BarbatosClub 组织单元内的用户可以登录;而DC=cyrene,DC=ghostchu,DC=com则是整个 cyrene.ghostchu.com 域里的所有用户都可以登录。

Ldap 用户搜索过滤器指的是搜索用户的时候,我们输入 (sAMAccountName=%s),具体的区别如下。

先让我们看一下下面这一段内容的输出:

Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <DC=cyrene,DC=ghostchu,DC=com> with scope subtree
# filter: (sAMAccountName=AkaYubiSim)
# requesting: ALL
#

# AkaYubiSim, BarbatosClub, cyrene.ghostchu.com
dn: CN=AkaYubiSim,OU=BarbatosClub,DC=cyrene,DC=ghostchu,DC=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: AkaYubiSim
instanceType: 4
whenCreated: 20250523195605.0Z
uSNCreated: 4089
name: AkaYubiSim
objectGUID:: fnH0HzbinUmGVqNT1oDkaw==
userAccountControl: 66048
codePage: 0
countryCode: 0
lastLogoff: 0
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAAW7kxs6o5popolamfUwQAAA==
accountExpires: 9223372036854775807
sAMAccountName: AkaYubiSim
sAMAccountType: 805306368
userPrincipalName: AkaYubiSim@cyrene.ghostchu.com
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=cyrene,DC=ghostchu,DC=
 com
mail: ************@qq.com
lastLogonTimestamp: 133925038211085570
badPasswordTime: 133925727442360140
memberOf: CN=Blogroll Manager,CN=Users,DC=cyrene,DC=ghostchu,DC=com
badPwdCount: 0
lastLogon: 133925768873579630
logonCount: 6
pwdLastSet: 133925768875041560
whenChanged: 20250524161447.0Z
uSNChanged: 4126
distinguishedName: CN=AkaYubiSim,OU=BarbatosClub,DC=cyrene,DC=ghostchu,DC=com

当我们指定使用 sAMAccountName 时,我们输入 AkaYubiSim 就可以登录 AkaYubiSim 这个账号,输入 userPrincipalName 就必须输入 AkaYubiSim@cyrene.ghostchu.com 才能登录 AkaYubiSim 这个账号,而如果用 distinguishedName,那就是需要输入 CN=AkaYubiSim,OU=BarbatosClub,DC=cyrene,DC=ghostchu,DC=com 才可以。

多 AD 域登录的环境下,一般使用 userPrincipalName,而我们只有一个 AD 域,直接使用 sAMAccountName 即可。

其它值保持默认。

最终我的 AList 配置如下:

配置 WordPress LDAP 登录

要在 WordPress 上使用 LDAP 登录,需要先给 PHP 安装 ldap 拓展,安装方式参见你使用的面板/管理器的教程,这部分内容超出了本文讲解范围。

安装后,安装插件 Next Active Directory Integration,并将其启用。你也可以用另一个商业插件,它配置更简单,但是高级功能需要付费。

由于在测试连接成功之前我们都不能修改配置,因此让我们转到 Environment 选项卡,配置连接信息。

Domain controllers 域控制器,填写我们的 AD 服务器 IP 地址:我这里是 100.125.104.20。

Port 端口,由于我们使用了 LDAPS,因此要用 636 端口。

Use encryption 加密方式,选择 LDAPS。

Allow self-signed certificates 允许自签名证书,必须打勾,我们的证书是 Synology 自己签发的,没有从可信 CA 购买。

Base DN 填写上面提到的 Base DN 值即可,这里是 DC=cyrene,DC=ghostchu,DC=com

随后来到 Verify Credentials 环节,第一个 Username 我们要输入我们的 userPrincipalName 样式的用户名,在这里是 cyrene@cyrene.ghostchu.com,Password 就填写 Cyrene 账号的密码。

一旦配置正确,就会显示我们的 Domain SID 和 NetBIOS 名称,并提示成功。此时插件的其余配置就会对我们开放。

配置权限组映射

转到 Permissions 选项卡,下面有个表单。左边的 Security group 填写你的 AD 域里的群组名称,右边的 WordPress role 选择 WordPress 对应的角色。

这样当用户登陆时,如果用户在 AD 域里在左边指定的 Security group 中,就会在 WordPress 中自动给该用户授予右边对应的角色。

页面底部还有个 Clean existing Roles 复选框,如果打勾,就会自动清除用户其它角色(例如你在 AD 里面把这个用户从群组里移除了,如果勾选这个复选框,对应的角色也会被移除)。

配置用户名样式

转到 User 选项卡,找到 Use sAMAccountName for newly created users 选项。

当勾选时,使用 sAMAccountName 名称作为 “用户名”,如:Cyrene

当不勾选时,使用 userPrincipalName 作为 “用户名”,如:cyrene@cyrene.ghostchu.com

推荐:不勾选,添加后缀。因为用户名不可冲突,如果有多 AD 则可能冲突而拒绝登录/注册。显示问题可通过配置昵称样式解决。用户一旦注册,再修改此选项并不会修改用户的用户名。

配置昵称样式

还是在 User 选项卡,页面底部有个 Display name 配置,默认为 sAMAccountName,如: Cyrene。

你可以自由修改成别的,推荐默认的 sAMAccountName。

自动同步个人资料(邮箱地址、头像等)

还是在 User 选项卡,选项 Automatic user synchronization 和 Automatically update user description 控制了用户资料同步。当勾选时,每次登录用户信息都会从 AD 同步。

需要注意的是,个人资料同步是单向同步。要修改头像、密码、地址等,需要用户登录使用 AD 账号登录到 Synology DiskStation 在个人设置里修改才可以。在 WP 里面修改密码头像不会更新到 AD。

你还可以配置 Sync to AD 和 Sync To WordPress 同步更多数据。但无论哪种,同步密码都是不可能的。

成果

最后,安全问题

如果你对 AD 域足够了解,建议控制 ”超级管理员“ 的账号权限,控制在必要范围即可。

总结

通过 Active Directory 管理用户、组织单元和群组。以及借助 AD 的 LDAP 协议兼容,连接到 WordPress 和 AList 上,实现一个账号,统一管理,到处登陆的效果;在 WordPress 上,还可以映射 AD 群组到 WordPress 角色,自动同步权限和身份组。

LDAP 几乎兼容市面上的大部分自部署的论坛、博客、CMS 等程序。尽管配置起来比 OAuth2 和 OpenID 更加复杂,但因为更强大并且支持的软件更多,也不失为一种选择。

推荐的其他文章

本站还有一些有关的文章,如果感兴趣也可以看看:

让 WordPress 变成 OAuth2/OpenID 服务器

给 NexusPHP 添加 OAuth2/OpenID 登陆支持

除特殊说明以外,本站原创内容采用 知识共享 署名-非商业性使用 4.0 许可。转载时请注明来源,以及原文链接
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇