进阶 docs.flarum.org 2026-10-15 14:50:53 · 19 阅读
第37章 Flarum GDPR 扩展指南:数据合规与账户管理
第37章:GDPR
版本:2.x GDPR
GDPR 扩展(flarum/gdpr)让成员能够掌控其个人数据,并为你提供处理相关请求的工具。这是一个内置扩展,默认处于禁用状态。启用后:
- 每位成员的设置中会增加一个“个人数据”部分,他们可以在这里下载数据副本或申请注销账户。
- 拥有相应权限的版主将审核注销请求,并决定是匿名化还是直接删除账户。
- 如果30天内无人处理已确认的注销请求,系统将自动执行。
- 从论坛中删除用户将视为 GDPR 注销操作(详见“作为版主注销账户”)。
该扩展处理基于 GDPR“访问权”和“注销权”的请求。仅安装此扩展并不能让你的论坛完全合规:你收集什么数据、原因以及保留时长,仍由你自行决定。
首先设置任务调度器
此扩展的自动功能依赖于计划任务:包括在30天后处理注销请求、删除旧的导出文件以及清除存储的 IP 地址。如果没有任务调度器,这些操作都不会执行。注销请求将永久等待版主处理,包含个人数据的导出档案也会一直留在磁盘上,且系统不会发出任何警告。
要求
- 任务调度器,每分钟运行一次。
- 有效的工作邮箱。成员通过电子邮件中的链接确认注销请求。
- 建议使用队列。导出和注销操作以队列任务形式运行。虽然在默认的同步驱动下也能工作,但它们在发起它们的网络请求(或计划任务)内部运行,对于活跃账户来说可能会较慢。
安装
该扩展随 Flarum 一起发布,但默认未启用。你可以在管理面板的“扩展”页面中启用它,然后检查下方的设置和权限。如果安装中缺失此扩展,请像其他包一样手动安装:
composer require flarum/gdpr
php flarum migrate
php flarum cache:clear
设置 在管理面板中该扩展的页面上可以找到这些设置。 设置 | 默认值 | 说明 允许处理删除请求的匿名化 | 开 | 允许版主通过匿名化来清除账号。 允许处理删除请求的删除 | 关 | 允许版主通过删除来清除账号,连同其发布的所有内容一起删除。 删除请求的默认操作 | 匿名化 | 请求在 30 天后被自动处理时,以及版主使用"按默认操作清除"时执行的操作。 匿名化用户的默认用户名 | Anonymous | 匿名化账号使用的用户名,会附上删除请求的 ID,例如 Anonymous12。 默认操作必须是你所允许的操作之一。如果默认操作是"删除"但删除未被允许,自动处理和"按默认操作清除"都会失败,账号不会被清除。 权限 该扩展会在管理面板的权限页面添加三项权限。 权限 | 范围 | 说明 处理删除请求 | Moderate | 查看已确认的删除请求,并用任何允许的操作处理它们。同时允许取消待处理的请求。 为其他用户请求并接收数据导出 | Moderate | 为其他成员发起数据导出。导出文件会发送给请求者本人,而不是被导出的成员。 查看匿名化用户徽章 | View | 在匿名化账号上显示"匿名化用户"徽章。可以授予访客。 凡是能删除用户的角色,都可以直接在用户控制菜单中清除账号,默认情况下只有管理员可以。 成员看到什么 每个成员的设置页面会多出一个"个人数据"区块,里面有两个按钮。 导出数据 "导出数据"会在后台准备一个包含该成员数据的 ZIP 压缩包。准备就绪后,成员会收到一条通知和一封带下载链接的邮件。 链接只能使用一次,一天后过期。下载完成或链接过期后,压缩包会在下次运行 gdpr:destroy-exports 时从服务器上删除。下载记录会记录文件被获取的时间、IP 地址和浏览器。 压缩包中包含: 一个文本文件,写明论坛名称、账号和导出日期。 成员在 users 表中的记录,但不包含 ID、密码、用户组和匿名化标记。 其头像。 其公开发表的评论帖子(内容、日期、IP 地址和讨论 ID)及其发起的讨论(标题和日期)。 其访问令牌、API 密钥、邮箱、密码令牌和已关联的登录方式,但不包含令牌的值。 其他已安装扩展添加到导出中的内容。 请求删除 "Erase Account"会要求成员输入密码并填写可选的理由,然后向其发送一封含确认链接的邮件。链接打开一个页面,成员点击"Confirm erasure"进行确认,此后请求才会送达版主。以其他账号登录的成员无法确认别人的请求;但持有链接的已登出访客可以。 打开链接本身并不会确认请求,因此会自动打开邮件中链接的邮件安全扫描器也无法代替成员确认。这一行为从 Flarum 2.0.1 起生效,在此之前打开链接即视为确认请求。 请求被处理之前,成员可以在同一位置取消它。拥有"处理删除请求"权限的版主也可以取消。请求被取消时,成员会收到通知和邮件;账号被清除后,还会收到最后一封邮件。 处理删除请求 只要有已确认的请求,拥有"处理删除请求"权限的用户就会在论坛头部看到一个"账号删除请求"下拉菜单。每个请求会显示提出时间、确认时间、成员填写的理由,以及可被自动处理的日期。 处理请求时会要求填写可选的备注,然后为每个允许的操作提供一个按钮:匿名化用户和删除用户。清除操作以队列任务方式执行。 自动处理 已确认但 30 天后仍未处理的请求,会由每日的 gdpr:process-erase-requests 任务按默认操作处理。这些请求会被记录为由系统而非人工处理。 匿名化 匿名化会保留成员的帖子和讨论,但抹去其作者身份: 用户名变为默认的匿名用户名加上请求 ID,邮箱变为@flarum-gdpr.local。
密码被替换为随机密码,偏好设置被重置,账号从所有用户组中移除。
users 表中的其他字段都会被清空,只有帖子数量之类的计数保留。扩展存储在表中的数据(如昵称或简介)也在清除之列。
头像被删除,所有访问令牌、API 密钥和已关联的登录方式一并删除。
其所有帖子上的 IP 地址都被移除。
匿名化后的账号无法再被操作:除了删除之外,所有针对它的权限检查都会被拒绝。其他人也无法再导出其数据。
删除
删除会移除该成员的所有帖子、头像和令牌,然后删除账号本身。其他表中通过数据库级联关联到该账号的数据也会一并删除。
从 Flarum 2.0.1 起,其发表过的讨论会保留,效果等同于逐条删除其帖子:
没有任何帖子剩下的讨论会被删除。
其发起且有他人回复的讨论会保留,现在从第一条剩余回复开始。它保留原始的发起日期,作者显示为已删除用户。
每个讨论的回复数、参与人数和最后一条帖子会被重新计算。启用 Tags 的情况下,每个标签的最新讨论也会重新计算。
与其帖子相关的通知会被移除。
版主清除账号
启用 GDPR 后,用户控制菜单中的"删除"按钮会被"清除"取代。它不需要成员发起请求:
"按默认操作清除"按默认操作清除账号。
如果两种操作都被允许,还会提供"匿名化用户"和"删除用户"两个独立按钮。
通过 REST API 的 DELETE /api/users/{id} 也是如此,它接受请求体中可选的 gdprMode 参数,取值为匿名化或删除。
清除垃圾账号
在默认设置下,清除垃圾账号会将其匿名化,其帖子仍会以匿名名义留在论坛上。如果要连帖子一起移除,可以允许删除并使用"删除用户",或者先手动删除帖子。
检查覆盖范围
GDPR Integrations 页面(管理导航和扩展设置中都有链接)列出了所有已注册的数据类型,以及它们在导出、匿名化和删除时的处理方式,还有是哪个扩展注册的。它还列出了被特殊处理的 users 表字段,以及哪些字段被视作个人数据。
在选择操作方式之前请先查看该页面。扩展存储的数据只有在扩展向 GDPR 注册后才会被覆盖;否则账号匿名化时这些数据会原样保留,也不会包含在导出中。
内置的 Messages 扩展注册了私信:成员的私信会包含在其导出中,账号匿名化时会被移除 IP 地址,账号删除时被一并删除。任何人都无法向匿名化后的账号发送私信。
计划任务
这些任务每天由调度器运行,也可以手动执行。
命令 | 说明
php flarum gdpr:process-erase-requests | 用默认操作处理超过 30 天的已确认请求。
php flarum gdpr:destroy-exports | 删除已下载或已过期的导出压缩包。
php flarum gdpr:clear-confirmation-ips | 在请求确认 90 天后,清除记录的确认 IP 地址。
使用独立队列
导出和清除可能比较耗时。如果你的论坛使用了命名队列,可以在 extend.php 中把该扩展的所有任务路由到某个队列:
use Flarum\Extend;
use Flarum\Gdpr\Jobs\GdprJob;
return [
// 路由处理所有 GDPR 任务(删除与导出),它们均继承自 GdprJob。
(new Extend\Queue())
->route(GdprJob::class, 'low'),
];
导出存储 导出档案写入 gdpr-export 文件系统磁盘,默认路径为 storage/gdpr-exports。由于其中包含个人数据,务必确保该目录不被 Web 服务器访问。 审计日志 启用 Audit 扩展后,请求、确认、取消、删除和导出操作均会被记录。参考 Flarum GDPR 在 Audit 的已记录操作列表。 已知限制 扩展标记为私有的帖子和讨论不会包含在导出中,除非该扩展主动将其添加。 面向开发者:如果扩展存储了个人数据,请注册该数据以便随账户一同导出、匿名化和删除。参见 GDPR 集成。
php flarum migrate
php flarum cache:clear
设置 在管理面板中该扩展的页面上可以找到这些设置。 设置 | 默认值 | 说明 允许处理删除请求的匿名化 | 开 | 允许版主通过匿名化来清除账号。 允许处理删除请求的删除 | 关 | 允许版主通过删除来清除账号,连同其发布的所有内容一起删除。 删除请求的默认操作 | 匿名化 | 请求在 30 天后被自动处理时,以及版主使用"按默认操作清除"时执行的操作。 匿名化用户的默认用户名 | Anonymous | 匿名化账号使用的用户名,会附上删除请求的 ID,例如 Anonymous12。 默认操作必须是你所允许的操作之一。如果默认操作是"删除"但删除未被允许,自动处理和"按默认操作清除"都会失败,账号不会被清除。 权限 该扩展会在管理面板的权限页面添加三项权限。 权限 | 范围 | 说明 处理删除请求 | Moderate | 查看已确认的删除请求,并用任何允许的操作处理它们。同时允许取消待处理的请求。 为其他用户请求并接收数据导出 | Moderate | 为其他成员发起数据导出。导出文件会发送给请求者本人,而不是被导出的成员。 查看匿名化用户徽章 | View | 在匿名化账号上显示"匿名化用户"徽章。可以授予访客。 凡是能删除用户的角色,都可以直接在用户控制菜单中清除账号,默认情况下只有管理员可以。 成员看到什么 每个成员的设置页面会多出一个"个人数据"区块,里面有两个按钮。 导出数据 "导出数据"会在后台准备一个包含该成员数据的 ZIP 压缩包。准备就绪后,成员会收到一条通知和一封带下载链接的邮件。 链接只能使用一次,一天后过期。下载完成或链接过期后,压缩包会在下次运行 gdpr:destroy-exports 时从服务器上删除。下载记录会记录文件被获取的时间、IP 地址和浏览器。 压缩包中包含: 一个文本文件,写明论坛名称、账号和导出日期。 成员在 users 表中的记录,但不包含 ID、密码、用户组和匿名化标记。 其头像。 其公开发表的评论帖子(内容、日期、IP 地址和讨论 ID)及其发起的讨论(标题和日期)。 其访问令牌、API 密钥、邮箱、密码令牌和已关联的登录方式,但不包含令牌的值。 其他已安装扩展添加到导出中的内容。 请求删除 "Erase Account"会要求成员输入密码并填写可选的理由,然后向其发送一封含确认链接的邮件。链接打开一个页面,成员点击"Confirm erasure"进行确认,此后请求才会送达版主。以其他账号登录的成员无法确认别人的请求;但持有链接的已登出访客可以。 打开链接本身并不会确认请求,因此会自动打开邮件中链接的邮件安全扫描器也无法代替成员确认。这一行为从 Flarum 2.0.1 起生效,在此之前打开链接即视为确认请求。 请求被处理之前,成员可以在同一位置取消它。拥有"处理删除请求"权限的版主也可以取消。请求被取消时,成员会收到通知和邮件;账号被清除后,还会收到最后一封邮件。 处理删除请求 只要有已确认的请求,拥有"处理删除请求"权限的用户就会在论坛头部看到一个"账号删除请求"下拉菜单。每个请求会显示提出时间、确认时间、成员填写的理由,以及可被自动处理的日期。 处理请求时会要求填写可选的备注,然后为每个允许的操作提供一个按钮:匿名化用户和删除用户。清除操作以队列任务方式执行。 自动处理 已确认但 30 天后仍未处理的请求,会由每日的 gdpr:process-erase-requests 任务按默认操作处理。这些请求会被记录为由系统而非人工处理。 匿名化 匿名化会保留成员的帖子和讨论,但抹去其作者身份: 用户名变为默认的匿名用户名加上请求 ID,邮箱变为
use Flarum\Gdpr\Jobs\GdprJob;
return [
// 路由处理所有 GDPR 任务(删除与导出),它们均继承自 GdprJob。
(new Extend\Queue())
->route(GdprJob::class, 'low'),
];
导出存储 导出档案写入 gdpr-export 文件系统磁盘,默认路径为 storage/gdpr-exports。由于其中包含个人数据,务必确保该目录不被 Web 服务器访问。 审计日志 启用 Audit 扩展后,请求、确认、取消、删除和导出操作均会被记录。参考 Flarum GDPR 在 Audit 的已记录操作列表。 已知限制 扩展标记为私有的帖子和讨论不会包含在导出中,除非该扩展主动将其添加。 面向开发者:如果扩展存储了个人数据,请注册该数据以便随账户一同导出、匿名化和删除。参见 GDPR 集成。