利用 LDAP 为 Dokuwiki 提供用户认证服务

前言

百科的发展

  说到百科,国际上最出名的莫过于 WikiPedia,而国内最出名的莫过于百度百科。当然,这两者也有一些差别。WikiPedia 支持多种语言,可以自由编辑,不过一般会要求提供必要的参考资料及链接来佐证。百度百科则只支持中文,对于编辑条目也有比较高的要求,一般来说是由专门的人员编写、审核。除了这两家之外,也有一些其他的大众百科,比如 中国大百科360 百科搜狗百科 等。大众百科的显著特点是范围非常广,适合大众科普,而想要查找一些太过详细的知识可能无法满足。

  于是随着百科特殊化的需求增大,越来越多的专门化或者特殊化的百科也开始涌现,比如与计算机专业相关的 集智百科AI 知识库,与游戏相关的 灰机 Wiki,与二次元动漫、小说相关的 萌娘百科 等等。这在一定程度上弥补了大众百科的不足,满足了大众对于专门化知识科普或者手册的需求。

开源百科程序

  既然是百科站点,就需要有百科程序来支撑用户管理、条目编辑、条目审核等功能。其实,世界上最大的百科站点 WikiPedia 使用的是免费开源的 MediaWiki。而百度百科则是采用自家开发的闭源程序,且与百度账号、百度知道等百度系产品打通。如果自己想要搭建一个百科站点,除了 MediaWiki 外,还有很多免费的选择,比如 DokuwikiWiki.jsNotion 等等。

  其中,Dokuwiki 是一个基于 PHP 的、可以百科站点、团队站点两用的开源程序。笔者比较喜欢 Dokuwiki 的一点是,完全不需要数据库可以独立部署以及支持版本迭代。这一点与“一切皆文件”的思想似乎很接近。(😂 实际上是因为笔者不愿意管理数据库) Wiki.js 虽然是基于 NodeJS 编写的,但还是需要连接数据库。Notion 是一款更像个人笔记的软件,无须自行部署,只需要使用 Web 端或者客户端编辑即可。Notion 本身支持很多开放性的功能,甚至说还能和 zotero 一起管理文献。如果非常熟悉 Notion 的各种功能,可能用 Notion 来搭建一个百科也非常合适。不过,笔者觉得要达到这种程度可能需要像学习宇宙无敌的 IDE – Visual Studio 一样复杂。

  Dokuwiki 的设计有点类似于 VS Code 的设计哲学,本体提供的只是最基本的、最简单的功能。如果你想要其他功能或者改变样式,你可以通过安装插件或者主题的方式来实现。而 Dokuwiki 官方和社区作者提供了比较丰富的插件和主题,能够有很好的可扩展性和 DIY 可能。就比如本文准备要为 Dokuwiki 接入的 LDAP 认证,实际上也是官方提供的插件之一。默认程序是已安装 LDAP Auth Plugin 插件的,我们只需要再做一些简单设置即可接入 LDAP 认证。

实践

  为了更加简便地实现 Dokuwiki 接入 LDAP 认证,这里采用了预先准备好的 Docker 镜像 – shuosc/dokuwiki。如果感兴趣的话,可以访问笔者维护的 shuosc/docker-dokuwiki 项目了解更多关于该镜像的构建细节。

预先准备的环境

  • Docker 环境
  • docker-compose 工具

Dokuwiki

创建实例

  使用下面的 docker-compose.yml 文件和 docker-compose up -d 命令启动一个 Dokuwiki 实例。这里的端口映射可以根据喜好或实际情况自行调整。

YAML
# docker-compose.yml

version: '2'
services:
  dokuwiki:
    image: shuosc/dokuwiki:latest
    ports:
      - 80:80
    environment:
      - DIR=wiki
    volumes:
      - ./data:/opt/data

运行验证

  访问 http://localhost/wiki/ 即可看到如下图所示的 Dokuwiki 实例首页。这里其实是已经使用默认的 admin 用户登录之后的页面了。

小提示

  shuosc/dokuwiki 默认管理员 admin 的初始密码为 admin。如果容器实例可被外部网络访问,出于安全性考虑建议在运行后及时修改成强密码。

首页 Home Page首页 Home Page

配置 LDAP 登录

安装 LDAP 支持

  由于 shuosc/dokuwiki 镜像本来不是为 LDAP 认证构建的,没有安装 LDAP 认证所需的 php7-ldap 库,所以需要在启动实例后进入容器内部安装一下,并重启容器实例生效。

SHELL
# 进入容器实例
docker exec -ti <id> /bin/bash 

# 默认用户为 root
apt update && apt install -y php7-ldap

# 退出容器实例后执行
docker restart <id>
小提示

  由于 shuosc/dokuwiki 镜像默认采用的 USTC(中科大)的软件源,笔者在安装 php7-ldap 库时遇到 Not Found 的错误。如果你也遇到了,可以将容器实例的软件源切换到其他软件源,比如执行 sed -i "s/ustc/nju/" /etc/apt/sources.list 即可从 USTC 切换到 NJU(南京大学)软件源。
  另外,这样的安装只是一种临时的解决方案,销毁并重建容器实例后仍然没有 php7-ldap 库。因此后续 shuosc/dokuwki 镜像将会增加这一支持。

设置 LDAP

  在登录成功后,可以如上步中图中所示点击右上角管理按钮进入管理页面

管理界面 Admin Page管理界面 Admin Page

  这里可以先点击扩展管理器确认一下 LDAP Auth Plugin 插件是否已预安装。这里由于是启用后的截图,所以右边没有卸载关闭按钮以及启用的提示。

扩展管理器 Plugins Manage Page扩展管理器 Plugins Manage Page

  返回刚才的管理页面,点击配置设置按钮即可进入完整的配置设置。如下图所示是 LDAP 认证部分的配置,在实际页面的比较靠后的位置可以找到。

LDAP 设置 LDAP SettingsLDAP 设置 LDAP Settings

  上图是默认的配置,我们需要填一下其中的一些条目,内容如下(其他保持默认即可):

条目 内容
server ldap.example.com
usertree ou=People,dc=example,dc=com
userfilter (&(objectClass=posixAccount)(uid=%{user}))
version 3
binddn cn=admin,dc=example,dc=com
bindpw xxxxxxxxxxx
modPass unchecked

启用 LDAP

  上步填写的是 LDAP 相关配置信息,这里还需要将默认的认证方式(authtype)从 authbasic 切换到 authldap,如下图所示。另外,为了保证 LDAP 的管理员用户可以访问 Dokuwiki 的管理页面,这里也需要指定超级用户(superuser)的用户名。

小提示

  由于启用了 LDAP 认证,这里应该要如下图所示停用 Dokuwiki 的注册功能,

启用 LDAP Enable LDAP启用 LDAP Enable LDAP

其他

  为 Dokuwiki 接入 LDAP 认证之后,所有指定组目录下的所有 LDAP 用户都可以正常登录 Dokuwiki。但由于 LDAP 只提供了用户登录验证,Dokuwiki 相应页面的权限仍然需要使用 Dokuwiki 自带的用户管理器来管理。具体操作可以 Dokuwiki Manual 来了解更多。

参考资料

版权声明: 如无特别声明,本文版权归 仲儿的自留地 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 LDAP 集成之 Dokuwiki 篇 》

本文链接:https://lisz.me/tech/webmaster/ldap-dokuwiki.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!