简体中文
  • oidc
  • wordpress

与 WordPress 集成进行授权

关于将 Logto 集成到 WordPress 的系列文章的第二部分,着重于授权。

Sijie
Sijie
Developer

在上一篇文章中,我们讨论了如何在 WordPress 中集成 Logto 来进行身份认证。这篇文章作为第二部分,将深入探讨授权过程,着重于 WordPress 中的角色系统以及如何实现与 Logto 的角色映射,考虑到我们在上一篇文章中使用的插件并不直接提供授权功能。

我们将创建一个角色映射功能,如根据 Logto RBAC (基于角色的访问控制) 提供的角色自动为用户分配 WordPress 角色。

理解 WordPress 用户角色

WordPress 有一个内置的用户角色管理系统,定义了用户可以在网站上执行什么操作(能力)。默认的用户角色包括管理员、编辑者、作者、贡献者和订阅者,每个角色都有自己的能力集。

这些角色对于维持站点运营的安全性和效率至关重要,因为他们可以确保用户根据他们的责任拥有适当的访问级别。

解决方案:自定义角色映射

Logto 采用基于角色的访问控制(RBAC)作为其授权模型,利用 "范围" 作为权限的最小单元。这些范围定义了认证用户在应用内允许执行的具体操作。然而,WordPress 对于管理用户权限的原则却有所不同,它依赖于预定义的 "角色" 将各种能力打包在一起。

鉴于这种基本的区别,我们建议在 Logto 内创建与在 WordPress 中定义的角色相对应的特殊角色。这些角色可能没有任何范围,只用于将用户映射到 WordPress 角色。

先决条件

在进行下一步之前,确保你有以下几点:

  • 完成了有关在 WordPress 中集成 Logto 进行身份验证的上一篇文章,包括:
    • 有管理员访问权限的 WordPress 站点。
    • 为你的 WordPress 站点设置了 Logto 帐户里的应用。
    • 在你的 WordPress 站点上已安装并配置了 OpenID Connect Generic plugin
  • 在 Logto 中设置与 WordPress 存在的角色相对应的角色。例如,如果你在 WordPress 里有一个 'editor' 角色,那么可以在 Logto 中创建一个 'group:editors' 角色。

使用自定义代码实现角色映射

为了实现角色映射,我们需要在 WordPress 主题的 functions.php 文件中添加自定义代码。这会涉及到 wp_login 动作钩子,当用户登录时会触发这个钩子。以下是一步步的指南,指导你如何设置:

第一步:访问你的主题的 functions.php 文件

打开你的主题的 functions.php 文件。通过 WordPress 管理面板可以访问这个文件,方法是导航到外观 > 主题编辑器,然后在右手边的文件列表中选取 functions.php 文件。或者在源代码中,导航到你的 WordPress 主题目录并找到 functions.php 文件。这个文件让你能够添加自定义的 PHP 功能来扩展 WordPress 站点的功能。

第二步:编写角色映射功能

下面是你可能会添加到 functions.php 中的函数的一个简单示例。这个函数将在用户登录时触发,并根据从 Logto 获取的用户的 roles 声明来分配角色。

第三步:理解代码并自定义它

  • logto_handler 函数:这个函数接受两个参数:$user_login (用户名)和 $user (用户对象)。它从 Logto 获取存储在用户元数据 'openid-connect-generic-last-user-claim' 中的角色,根据这些角色把它们映射到对应的 WordPress 角色,并分配给用户。

  • add_action:这条代码把 logto_handler 函数钩到 wp_login 动作,该动作在用户登录后触发。其中,10 是优先级(默认),2 表示函数接受的参数个数。

上例中将 'editor' 角色分配给已经通过 Logto 认证并且角色名为group:editors 的用户。然而,在真实的场景中,可能需要实现更多类型的角色映射。

你可以在这里找到 WordPress 角色及其能力的列表。

第四步:测试设置

现在,让我们通过用 Logto 中有 group:editors 角色的用户登录来测试角色映射功能。登录后,检查 WordPress 中的用户角色,确保映射工作正常。

结论

通过将 Logto 与 WordPress 集成进行身份验证和授权,你可以增强你站点的安全性和功能。请记住,虽然这里提供的代码是一个基本示例,但可能需要调整它以适应WordPress 站点的角色和权限结构。