七日磨一剑:发布访问控制

思源笔记的发布服务是相对其他本地化笔记来说的一个亮点,其带来了其他本地化笔记稀缺的一个属性:分享。我之前也经常写博客分享,但是每次写完发布到现有平台或者静态博客生成器时总是会出现格式错误等文档,属实闹心。从开始使用思源笔记起,我就计划着把它的发布服务利用上,用于发布我的博客。然而,目前的发布服务会将所有的笔记本和文档都发布出去,带来信息泄露的恐慌。至少对我来说,我是不敢把所有文档都发布出去的,于是至今,我的新博客也未能建成。

6 月份的时候,我趁着有活动,购买了一年的云服务器,计划着为新博客预备。然而三个多月过去了,新博客还一点动静都没有。于是趁着国庆假期,我也抽了几天开始试图自己开发一个发布增强插件,用于实现自定义发布。做一半的时候才意识到插件的方案无论如何都会有数据泄露的风险,还是得从官方入手。于是我 clone 了源码,为思源贡献了一个新功能:发布访问控制( Pull Request #16041 · siyuan-note/siyuan )。

功能

  • 每个文档和笔记本都可设置 公开/保护/隐藏/私密/禁止 这五种权限
    • 公开:文档树中可见,内容可被搜索,可直接访问
    • 保护:文档树中可见,内容不可被搜索,访问时提示输入密码
    • 隐藏:文档树中不可见,内容不可被搜索,可直接访问
    • 私密:文档树中不可见,内容不可被搜索,访问时提示输入密码
    • 禁止:文档树中不可见,内容不可被搜索,访问时提示禁止访问
  • 发布服务里,设置为不可见(隐藏/私密/禁止)的文档/笔记本及其下属的所有文档不会出现在文档树、标签、书签、局部关系图、全局关系图、双链、标签页、搜索、最近文档中,数据都会被后端过滤掉再传给前端,前端只会显示发布可见的笔记本和文档,PS:设置为保护的文档虽然能够被检索到,但是具体的文档内容需要输入密码才会显示
  • 设置为”隐藏/私密/禁止“的文档可以在发布服务里通过嵌入块/引用/?id=的链接查看,区别在于隐藏的文档可以直接看到内容,私密的文档需要输入密码,禁止的文档完全无法获取到内容
  • 关闭的笔记本不会出现在发布服务中

效果展示

发布访问控制 UI

1.png

文档树上方的工具栏增加一个 “发布访问控制” 的按钮,点击后原本的文档图标 变化为 表示文档访问权限的图标,只需点击图标即可修改对应文档的发布访问权限:

2.png

3.png

4.png

5.png

6.png

整体对比

7.png

发布后:

8.png

其中可以注意到:文档树、标签、标签页、关系图、反向链接中有关不可见文档的内容都已消失。

可直接访问/密码访问/禁止访问 的区别

虽然 隐藏/私密/禁止访问 这三种权限的文档不会出现在文档树里,也搜索不到,但是在可见(公开/保护)的数据库/嵌入块/引用里包含了这些文档,文档会显示出窗口,但是其内容会被替换。

9.png

以上述数据库为例,

  • “知识 C”是公开文档
  • “知识 A"是隐藏文档
  • ”知识 AAA”虽然标记为公开,但是其在隐藏的”知识 A“下,所以它也是不可见的,同理,其也在加密的”知识 AA“下,因此也需要密码才能访问,其最终表现出来的行为其实是 私密。
  • ”论文 A"是禁止文档

我们来看一下当鼠标放在数据库上这些文档时弹出的窗口会显示什么:

10.png

11.png

12.png

总结

原本只打算做可见/不可见的,中间历经几次变更,最后把禁止和密码访问也加了进来,算是能满足大部分用户的需求了吧。目前功能已基本完成,不过还需要测试,官方预计明年一季度才能发布。在此期间我再打磨打磨,之后也会打包 release 在我的分支上,有兴趣的同学们也可以下载帮忙测试,谢谢大家。之后我还计划做一个发布增强插件,提升发布分享的体验,各位如果有什么相关需求和 idea 也非常欢迎,也许我会顺便做一下。

PS:这个 UI 已经是我的审美的极限了 😂,不一定会很符合大众的美感,我不太擅长设计界面,如果有什么 UI 的建议也可以提一提 orz。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28446 引用 • 119783 回帖

相关帖子

优质回帖
  • 感谢yuxinzhao的 PR,我 build 到 docker 内了,大家想体验直接运行以下命令即可启动

    docker run -d -v /siyuan/workspace:/siyuan/workspace -p 6806:6806 -p 80:6808 -u root:root crpi-8r9w3eevpt68aj3u.cn-hangzhou.personal.cr.aliyuncs.com/congsec/congsec:zyx_siyuan --workspace=/siyuan/workspace/ --accessAuthCode=你的密码

  • stevehfut 1 赞同

    对了涉及到远程访问,希望大佬可以 pr 一个多因素认证登陆(应该有相关 issue),目前远程访问思源的安全性感觉不高(若别人知道密码,便可轻易访问或修改你的远程思源笔记)

  • yuxinzhao 1

    我在看思源的代码的时候好像有看到双因子认证的代码,也许之前有实现过也说不定,我先看看

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • yuxinzhao

    本来打算速战速决,也打算舍弃多用户功能,现在反倒觉得还是需要的,不然真合并了后面再改起来还得兼容前面的太麻烦了,还是一次完成比较好,打算再重构了

    1 回复
  • 其他回帖
  • image.png

    • 公开:文档树中可见,内容可被所有角色所有用户搜索,可直接访问
    • 保护:文档树中可见,内容不可被搜索,仅指定角色或指定用户访问
    • 隐藏:文档树中不可见,内容不可被搜索,可被指定角色或指定用户直接访问
    • 私密:文档树中不可见,内容不可被搜索,仅指定角色或指定用户访问
    • 禁止:文档树中不可见,内容不可被搜索,访问时提示禁止访问
    1 回复
  • fyislo 1 36 评论

    如图所示

    标签页在第一次访问发布服务后一一对应

    image.png

    但如果标签页都属于「禁止」「私密」「隐藏」权限中一种,打开发布服务是空白状态,不属于没有标签页的正常显示状态。

    image.png

    39 操作
    fyislo 在 2025-10-17 23:33:42 更新了该回帖
    fyislo 在 2025-10-17 23:32:40 更新了该回帖
    fyislo 在 2025-10-17 23:31:04 更新了该回帖
    fyislo 在 2025-10-16 23:00:24 更新了该回帖 fyislo 在 2025-10-16 22:51:40 更新了该回帖 fyislo 在 2025-10-16 20:11:36 更新了该回帖 fyislo 在 2025-10-16 19:45:35 更新了该回帖 fyislo 在 2025-10-16 19:38:47 更新了该回帖 fyislo 在 2025-10-16 19:35:42 更新了该回帖 fyislo 在 2025-10-16 19:30:02 更新了该回帖 fyislo 在 2025-10-16 19:28:21 更新了该回帖 fyislo 在 2025-10-16 15:57:30 更新了该回帖 fyislo 在 2025-10-16 14:23:18 更新了该回帖 fyislo 在 2025-10-16 12:02:00 更新了该回帖 fyislo 在 2025-10-16 01:44:21 更新了该回帖 fyislo 在 2025-10-16 01:39:06 更新了该回帖 fyislo 在 2025-10-16 01:35:04 更新了该回帖 fyislo 在 2025-10-16 01:34:10 更新了该回帖 fyislo 在 2025-10-16 01:31:14 更新了该回帖 fyislo 在 2025-10-16 01:00:59 更新了该回帖 fyislo 在 2025-10-16 00:32:43 更新了该回帖 fyislo 在 2025-10-16 00:32:05 更新了该回帖 fyislo 在 2025-10-16 00:30:19 更新了该回帖 fyislo 在 2025-10-16 00:26:21 更新了该回帖 fyislo 在 2025-10-15 22:18:49 更新了该回帖 fyislo 在 2025-10-15 22:17:20 更新了该回帖 fyislo 在 2025-10-15 21:52:25 更新了该回帖 fyislo 在 2025-10-15 18:15:43 更新了该回帖 fyislo 在 2025-10-15 13:05:37 更新了该回帖 fyislo 在 2025-10-14 21:06:47 更新了该回帖 fyislo 在 2025-10-14 21:05:41 更新了该回帖 fyislo 在 2025-10-14 21:03:15 更新了该回帖 fyislo 在 2025-10-14 21:02:30 更新了该回帖 fyislo 在 2025-10-14 20:44:24 更新了该回帖 fyislo 在 2025-10-14 20:41:58 更新了该回帖 fyislo 在 2025-10-14 06:26:39 更新了该回帖 fyislo 在 2025-10-14 06:25:12 更新了该回帖 fyislo 在 2025-10-14 06:19:46 更新了该回帖 fyislo 在 2025-10-14 05:58:31 更新了该回帖
    收到,感谢反馈,我尽快修复
    yuxinzhao
    多把锁的问题和「全选删除内容后,重新输入,访问界面可看见新内容」的问题都已修复。不过「未找到 id」和测试页面没有内容的问题我没能成功复现。
    yuxinzhao
    @yuxinzhao 膜拜大佬,「未找到 id」也可能是我这边的问题,我重启笔记本就好了。「测试」页面没有内容我再测试一下。目前最新版本我发现了另外的 bug:「加载“保护”文档有概率加载不出来锁」似乎是/api/filetree/getDoc 的问题。通过网盘分享的文件:10141628 最新 bug.mp4 链接: https://pan.baidu.com/s/1qt6APgv8jiPVx7qWt9FfQw?pwd=gfjg 提取码: gfjg
    fyislo
    @fyislo 「加载“保护”文档有概率加载不出来锁」也修复好啦,是修改多个锁的问题的时候不小心引入的
    yuxinzhao
    @yuxinzhao 应该没什么问题了,不过还有些细节,如果可以优化一下就更好了。细节一:「嵌入块内容是“保护/私密”,显示锁,但输入密码后不能提交并显示内容。非发布情况下有悬浮窗且可以编辑内容,我觉得可以保留,这样可以输入密码显示嵌入块内容。」细节二:「https://github.com/siyuan-note/siyuan/issues/11928#issue-2398323921 提到的,“标题、列表、数据库分组 折叠后无法再展开”」,如果能解决掉体验会更好,再次感谢大佬的 PR。
    fyislo
    @yuxinzhao 又发现一个 BUG,数据库卡片视图,可以展示出禁止访问的内容。
    fyislo
    @fyislo 收到,感谢测试
    yuxinzhao
    @yuxinzhao 我编辑了回帖,上面有图片:可以通过 文档 上面数据库名称访问到 「数据库(禁止)」下的数据库
    fyislo
    @fyislo 嵌入块无法提交密码的问题我修复了。但是这个数据库的问题可能得在考虑下,是数据库中直接不出现不可见的项目,还是卡片中的图片加锁/禁止就好
    yuxinzhao
    @yuxinzhao 我个人提议:应该和文档保持一致。「禁止」「私密」「隐藏」都不应该显示,这三个状态的设定就是不显示出来。「保护」则显示一把锁,可以鼠标移动到主键上弹出悬浮框解锁。 就是大佬说的:“让人知道我有这个东西是另一种泄密”
    fyislo
    @fyislo 卡片视图图片的问题我修复了,私密和保护会显示锁,禁止显示禁止图标,不过我暂时没有直接不显示不可见的表格项,因为我觉得隐藏的一个应用场景就是给别人一个链接,这个链接里是一个汇总了相关文档的表格,相当于一个目录,借此实现文档的批量动态分享。不过禁止的倒是可以直接不显示在数据库中,这个再看看其他人反馈吧
    yuxinzhao
    @yuxinzhao 我更新了图片,展示了新问题。用数据库当作目录批量分享文章的确方便许多,数据库有筛选功能,视图展示等。之前我设想的批量分享,是在文档树中选中对应的文章,拖拽进某个文档内,会自动形成无序列表的块引用,当作目录分享。大佬解释后,数据库批量分享文章的确很合适。不过「禁止」的文档确实没必要显示出来了。感谢大佬
    fyislo
    @fyislo 收到,我尽快修复
    yuxinzhao
    @fyislo 修复好了,现在禁止数据库不会出现在文档的属性中,数据库中也不会显示禁止的文档
    yuxinzhao
    @yuxinzhao 我更新了回帖,有新 bug……麻烦大佬了。
    fyislo
    @fyislo 两个问题都修复好了,第二个问题是因为上一个版本重构的时候有个小疏漏,导致禁止文档正常但是禁止笔记本下的文档不会被禁止,还麻烦再测试一下,谢谢
    yuxinzhao 1
    @yuxinzhao 我更新了回帖,大佬瞅瞅,感谢。
    fyislo
    @fyislo 三个问题都已修复,感谢反馈
    yuxinzhao 1
    @yuxinzhao 如图所示,问题一:“标签”和“字符那一行”,“引用数”的统计也应该隐藏,「禁止」不显示,「保护」「私密」解锁后显示。问题二:反向链接会显示出内容。「保护」「私密」反向链接会显示对应的块引用。「禁止」目前正常不会显示。我测试老是漏掉一些小细节,但看见 bug 就想先反馈一下……麻烦大佬了。 或者等我多用几天,再统一修改。
    fyislo
    @fyislo 没关系,发现问题马上反馈就行,尽管反馈,我也很乐意能够尽早完善它,说不定还能够提前合并呢
    yuxinzhao
    @fyislo 已修复标签、引用数、反向链接的问题,不过右下角的字数这些我没动,我觉得这个不会泄露隐私
    yuxinzhao 1
    @yuxinzhao 感觉已经很完善了,还有几个问题,更新在回帖上面了。
    fyislo
    @yuxinzhao 大佬有考虑在“发布访问控制”添加单击右键行为吗,单击右键弹出一个菜单,有“显示全部”、“公开”、“保护”、“隐藏”、“私密”、“禁止”6 个选项,用来筛选对应权限的文档。 文档多了,有个可以筛选权限的方法会好很多。这个插件应该也可以实现,但我觉得自带会更好,算是个基础功能。 “发布访问控制”的按钮可以启用发布服务时再显示,不启用就不显示(这个方便可以弄弄,不方便也无伤大雅。)。
    fyislo
    @fyislo 筛选对应权限这个功能不太好定义,比如保护下的隐藏文档其实应该算作私密,最好还是展示完整的文档便于查看上级文档是什么权限从而知道当前文档是什么状态。而且我更推荐一个文档下的所有文档要加密的话,只加密上级的那个文档就可以,如果变成筛选的话,可能会有人筛选公开的然后一个个全给标记为保护,这个其实不太推荐,如果设置了权限的文档多的话在发布服务中可能会卡,目前还没有测试到它的性能。另外,发布访问控制按钮仅在启用发布服务时再显示其实不太合理,因为你刚启动发布服务还没有设置发布访问状态的时候,那一时刻你的发布服务里所有人都可以访问到你的所有文章,所以正确的使用逻辑应该是要启动发布服务前能够确认一下当前所有文档的状态再开启发布服务,为此发布访问控制状态的按钮应该常驻
    yuxinzhao 1
    @yuxinzhao 感谢回答,是我考虑欠佳了。又发现一个 bug,搜索界面直接显示了权限为「保护」文档下的内容。更新到回帖上了。
    fyislo
    @fyislo 都修复好了
    yuxinzhao
    @yuxinzhao 导出预览复制到语雀,可以把权限为「禁止」「保护」「私密」的文档内容复制出来。复制到知乎、复制到公众号这两个正常。
    fyislo
    @fyislo 复制到语雀 修复好了
    yuxinzhao
    @yuxinzhao 如图所示,通过右上角的“命令面板”,可以进入"设置",进而查看很多东西。
    fyislo
    @fyislo 感谢测试,我把命令面板和它的快捷键隐藏了,不过插件和前进后退没有动,目前不会泄露隐私,而且说不定官方有其他用处,先不改。另外,我改好了它的移动端了,就是把网址里的 desktop 改为 mobile 的界面,如果你有兴趣的话也可以再测试一下移动端,谢谢
    yuxinzhao
    @yuxinzhao 好的,后面我也会测试移动端。有个 bug,移动端:反向链接可以访问到「禁止」「私密」「保护」的块引用。 2、同一文档,PC 和移动端的 反向链接 和 提及 显示内容不同。
    fyislo
    @yuxinzhao 网址 +?id={id},PC 可以访问到对应的文章,移动端不可以。
    fyislo
    @fyislo 移动端反向链接访问到禁止私密保护的问题修复了,移动端和 PC 获取到反向链接内容确实可能是不同的,因为他们调用的接口都不一样,一个是 getBacklink,一个是 getBacklink2,不知道是不是之前升级过 PC 端的结果移动端忘了升级,还是有什么差别,这个问题可能得交给官方解决。网址 +?id={id}移动端无法访问的问题我这儿不会,可以访问的,会不会是你 id 复制不全
    yuxinzhao
    @yuxinzhao 不好意思,是我表达有误。昨天想表达的是,“反链”和“提及”在 PC 不会显示,在移动端会显示出来,并非显示内容不同(当然这也算显示内容不同),目前最新版还是会出现这个情况,可能要官方处理的话,那这个问题就先不管了。网址 +?id={id}移动端无法访问,这个今天我测试又好了。之前提到“未找到 id”和“页面内容不加载”两个问题,我发现都是因为代码片段引起的,即使我禁用了所有代码片段,主题默认,似乎有个别 JS 还会运行,才导致了这两个问题发生,我这的网址 +?id={id}移动端无法访问似乎也是因为这个原因。等后面我发个帖子向大家求助一下问题。
    fyislo
    @yuxinzhao 如果标签页都属于「禁止」「私密」「隐藏」权限中一种,打开发布服务是空白状态,不属于没有标签页的正常显示状态。
    fyislo
    @fyislo 已修复标签页,另外移动端的也修复了,只会显示可见的
    yuxinzhao
  • fyislo 4 评论

    下列所有情况的操作步骤都是「操作客户端并同步」->「docker 同步」->「检查 docker 文档树权限,检查页面更新情况,访问发布服务页面检查权限」

    权限客户端与 docker 同步问题,经过测试,修改过的文档内容都会及时更新,只有权限会出现一些问题,有以下情况出现:

    1. 权限图标未及时更新,访问发布页面,权限为修改后权限,手动收起展开文档树可更新图标,不操作文档树不会更新。
    2. 权限图标未及时更新,访问发布页面,权限为修改前权限,等待一定时间后(3-10s),再次访问发布页面权限为修改后权限,这时手动收起展开文档树可更新图标,不操作文档树不会更新。

    综上,我觉得权限数据同步正常,只是没有及时更新文档树图标(对应图标未变,发布页面为修改后权限),亦或是没有及时加载更新后的权限数据(对应图标未变,发布页面为修改前权限)。

    这个问题无伤大雅,情况 2 无非多等一下,不过能优化一下会更好。
    fyislo
    @fyislo 感谢测试,明白问题了,之后修改
    yuxinzhao 1
    @yuxinzhao 大佬,可以支持访问发布页面时,不跳转到上一次打开/编辑位置。正常使用时,在页面中间位置关闭,再次进入会回到上一次打开/编辑的位置。发布页面应该从文档最上方访问才对。
    fyislo
    @fyislo 我觉得这个可能和首页一样,交给插件实现更好,毕竟每个人需求可能不一样
    yuxinzhao
  • 查看全部回帖