Zeruns's Blog - 技术分享/Linux/嵌入式/VPS评测/NAS/电子DIY

【开源】Discourse 回帖可见/登录可见插件(discourse-reply-to-view),回复解锁隐藏内容

前言

最近在折腾自己论坛(bbs.eeclub.top)的时候,需要一个"回帖可见"的功能:会员必须回复主题后才能看到帖子里隐藏的资源链接、下载地址等内容,一方面可以刺激论坛活跃度,另一方面也能防止内容被白嫖。

Discourse 本身只有一个 [hide] 标签(对匿名用户隐藏),完全满足不了"回帖解锁"的需求。网上找了一圈没有现成的插件,干脆自己写了一个,取名为 discourse-reply-to-view。整个项目由 AI(GLM)辅助开发,我负责提需求、测试和验收,前后端加测试一共两千多行代码,开发体验相当丝滑。

各家AI大模型API平台推荐与简介:https://blog.zeruns.com/archives/947.html

插件介绍

discourse-reply-to-view 是一个 Discourse 内容保护插件,提供三种 BBCode 标记:

标记作用
[reply]内容[/reply]回帖可见:在本主题回复后才能看到
[​login]内容[​/login]登录可见:注册/登录后就能看到
[reply=N]内容[/reply]回复计数:在本主题发至少 N 条回复后可见(可选开关)

标记里面可以正常嵌套 Markdown,代码块、图片、链接、列表都不受影响;两种标记写在一行里([reply]xxx[/reply])也是支持的。

主要特性

使用方法

在编辑器里通过「+」菜单插入,或者直接手写 BBCode:

[reply]
这里写回帖后才能看到的内容,比如下载链接
[/reply]

[​login]
这里写登录后就能看到的内容
[​/login]

[reply=5]
发满 5 条回复才能看到的内容(需要在后台开启计数语法)
[/reply]

前台效果:未满足条件的用户会看到一个占位框(回帖可见是蓝色主题、登录可见是绿色主题),点按钮直接跳回复框或登录页,满足条件后自动显示完整内容。

安全设计

这个插件我最看重的就是安全性,毕竟"假隐藏"(前端藏起来但数据都在)形同虚设。它的安全架构是这么设计的:

  1. 存储层零原文:Markdown 渲染阶段就把标记内的原文丢弃,数据库里只存一个带指纹的占位容器 <div class="rtv-block">
  2. 序列化期注入:原文只在接口序列化时按当前用户权限动态注入,没解锁就拿不到,连 HTML 源码里都没有;
  3. 全出口封堵:raw 导出、搜索索引、邮件通知、修订历史 diff、内容本地化翻译版本这些容易漏的口子都堵上了;
  4. 无缓存泄露窗口:权限判定实时计算,回复后立即生效,不存在低权限用户命中高权限缓存的问题。

安装方法

使用官方 Docker 部署的 Discourse,编辑 containers/app.yml,在 hooksafter_code 里加一行:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/zeruns/discourse-reply-to-view.git

然后重建容器(前端资产要重新编译,必须 rebuild 而不是 restart):

cd /var/discourse
./launcher rebuild app

装完之后在 管理后台 → 设置 → 插件 里可以调整:

兼容性

在最新版 Discourse(master 分支,2026-09 构建)上开发并验证,依赖新版 markdown-it BBCode 体系,建议 Discourse 3.4 及以上版本使用。测试方面有 79 个 RSpec 用例覆盖权限矩阵和各个泄露面,连续随机顺序运行全绿。

相关教程

项目地址与演示

觉得有用的话去 GitHub 点个 Star 支持一下~

总结

这个项目也算是一次"AI 主力开发 + 人负责验收"的实践:需求、边界条件和安全场景我来定,编码、测试用例、文档由 AI 生成,中间还抓出了好几个我自己都没想到的泄露面(raw 导出接口、修订历史 diff、翻译版本),AI 在这类边界条件枚举上确实比人靠谱。有兴趣折腾论坛的可以试试,有问题欢迎在 GitHub 提 issue,或者在评论区留言。

推荐阅读

English Version of the Article: https://blog.zeruns.top/archives/100.html

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »