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

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

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。

  • 思源笔记

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

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

    28442 引用 • 119756 回帖

相关帖子

优质回帖
  • 感谢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

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

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • fyislo 1 评论

    如图所示,启动发布服务的思源(客户端/docker),只打开了「公开」文档 1,访问时:

    • PC 端加载的页面是正常的「公开」文档 1。
    • 移动端则可能加载曾经打开过的页面。

    希望移动端也可以像 PC 端一样,首次加载页面为:启动发布服务的思源(客户端/docker)打开的页面。

    PixPin20251105012933.png

    这个可能不好在访问控制的 PR 里去改,可能需要另外提 issue 和 PR,实际上移动端和 PC 端在启动时获取页面的规则是不同的,我更偏向于用 homepage 插件固定一个页面为首页
    yuxinzhao
  • 其他回帖
  • fyislo 1 评论

    大佬,我个人觉得:禁止权限的文档名称应统一显示「禁止访问」,或者不显示。

    「公开」、「隐藏」、「保护」、「私密」,这 4 个权限本质上来说都是希望对外分享的,只是应用的场景不同。

    而「禁止」则是彻彻底底的不希望别人看到里面的任何内容,这其中应该包括文档名。

    举一个实际场景:

    “王小二”是一个真实名字,在其它文章中难免会有引用,可以通过静态锚文本隐藏真名,也可以通过动态锚文本配合命名功能隐藏真名。但现在的「禁止」并不能算彻底的禁止,它泄漏了文档名。

    image.png

    「禁止」权限不应该返回任何有效内容。

    当然,别的文章存在引用是不可避免的,但静态锚文本已然隐藏了文档名,动态锚文本只需要配合命名就可以隐藏了。

    (这也是我这久使用的痛点,别的地方只要引用了「禁止」权限内容,就会泄漏文档名……对于「禁止」来说,这也算一种泄漏,望采纳,感谢。)

    可以,之后可能改成直接访问不到这个界面,而不是显示禁止访问。不过最近暂时没有时间修改,可能一周后有空再处理,谢谢
    yuxinzhao
  • fyislo 4 评论

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

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

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

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

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

    感谢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=你的密码

    赞 👍
    yuxinzhao
    @yuxinzhao 建议输入密码后可以回车按键确认密码
    CongSec
  • 查看全部回帖