[开发]SoSite 附件权限更新包(2026-08-09)

👑Lv.11 元老 🌞 骨干会员
2026-10-24 00:09:18

本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:8月12日的备份/update/9/README-部署说明.md。

SoSite 附件权限更新包(2026-08-09)

本目录包含 1 个新增 + 8 个修改 的文件,按原目录结构放置。

覆盖方式:将本目录内所有文件按相同路径上传覆盖到站点根目录(如 D:/phpstudy_pro/WWW 或服务器对应路径)。

生成环境:PHP 8.2 / MySQL 5.7.26。


一、本包功能说明

  1. 附件上传权限:category_permissions 表新增 can_attach 列,后台"版块权限"矩阵新增"附件"列——可逐用户组控制某版块能否上传附件(发帖/回帖/编辑时校验)。
  2. 附件下载权限:新增 GET /attachment/{id} 下载入口(替代原 /assets/uploads/ 静态直链),权限跟随版块 can_view——能浏览该版块才能下载其附件(未登录按游客组判定)。
  3. 预留插件扩展点:下载控制器输出文件前触发 attachment_download_before 钩子(供后续积分下载等插件拦截,约定 $GLOBALS['attachment_download_error'] 非空即 403)。

二、数据库变更(1 条,幂等,无需手动执行)

  • ALTER TABLE category_permissions ADD COLUMN can_attach TINYINT(1) NOT NULL DEFAULT 1
  • 由后台首次保存"版块权限"时自动执行(Permission::ensureCanAttachColumn() 幂等),列已存在时静默忽略。
  • ⚠️ 加列默认值 1 = 所有存量记录自动放行附件,不破坏现有站点行为;只有后台重新保存权限(取消勾选"附件")后对应组才受限。

三、覆盖前必须做的事

备份服务器现状

把服务器上以下文件/目录整体备份一份(zip 即可):

  • app/Helpers/Permission.php
  • app/Controllers/(PostController.php、ThreadController.php、AttachmentController.php、Admin/GroupController.php)
  • app/Views/thread/show.php、app/Views/admin/permissions.php
  • index.php

四、本包包含的文件清单(9 个)

新增(1)

  • app/Controllers/AttachmentController.php —— 附件下载控制器(canView 权限校验 + attachment_download_before 钩子 + 路径穿越防护)

修改(8)

文件改动
app/Helpers/Permission.phpcheck() 白名单加 can_attach;新增 canAttach() / ensureCanAttachColumn() / canAttachColumnExists();saveCategoryPermission() 加 $canAttach 参数
app/Controllers/Admin/GroupController.php权限保存时调用 ensureCanAttachColumn() 并传 can_attach
app/Views/admin/permissions.php权限矩阵新增"附件"列(默认勾选)
index.php注册 GET /attachment/{id} 路由 + AttachmentController use
app/Controllers/PostController.php发帖 create() / 编辑 edit() 携带附件时校验 canAttach
app/Controllers/ThreadController.php回帖 reply() / 编辑 edit() 携带附件时校验 canAttach
app/Views/thread/show.php主帖+回帖附件链接改为 /attachment/{id};附件容器加 data-attachment-id(插件铺路)
sosite-plugin-dev/references/02-hooks-catalog.md登记 attachment_download_before 钩子文档

五、部署步骤(推荐顺序)

  1. 备份(见第三节)
  2. 上传本 update 包全部文件,按路径覆盖
  3. 进入后台"版块权限"页随便保存一次(触发 can_attach 列幂等创建,若此前未创建)
  4. 清空模板编译缓存:protected/cache/templates/ 目录下文件(模板引擎会自动重建)
  5. 浏览器回归验证(见下)

六、回归验证清单

页面/场景检查点
/admin/permissions?category_id=1矩阵出现"附件"列,默认勾选;取消某组附件勾选保存后刷新保持未勾选
帖子详情(有附件帖,如 /thread/96)附件链接为 /attachment/{id},容器带 data-attachment-id
未登录访问 /attachment/{id}游客组可浏览的版块 → 200;游客不可见的版块 → 403
登录态访问 /attachment/{id}有权限 → 200 正常下载;图片内联展示、zip 等强制下载
无附件权限组上传附件发帖/回帖提示"您没有权限在该版块上传附件"

七、注意事项

  • 历史直链 /assets/uploads/xxx 仍可访问(无法追溯),本次未强制迁移;新链接全部走 /attachment/{id}
  • 正文内嵌图片(发帖内容里的 uploads 图)仍为直链,不受本次权限控制
  • 图片附件走权限路由后,若管理员关闭了某组/游客的 can_view,该组将连帖子内附件图片都无法查看(跟随 can_view 的自然结果)

本包由 2026-08-09 会话生成(附件上传/下载权限 + 下载前钩子预留)。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 4 次 | 回复 0 次

全部回复 (0)

暂无回复

请 登录