From 7047b3335838de38e27d3e9852b354a95d858b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=A0=E9=97=BB=E9=A3=8E?= Date: Mon, 22 Jun 2026 19:07:13 +0800 Subject: [PATCH] up --- PERMISSIONS_AND_USER_ARTICLES.md | 223 +++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 PERMISSIONS_AND_USER_ARTICLES.md diff --git a/PERMISSIONS_AND_USER_ARTICLES.md b/PERMISSIONS_AND_USER_ARTICLES.md new file mode 100644 index 0000000..29cb1fd --- /dev/null +++ b/PERMISSIONS_AND_USER_ARTICLES.md @@ -0,0 +1,223 @@ +# 权限控制与用户文章管理功能 + +## 提交摘要 +本次更新修复了权限边界问题,并为普通用户添加了独立的文章管理功能。 + +## 1. 权限控制修复 + +### 问题 +- 普通用户(author角色)能够访问后台管理页面 `/admin` +- 普通用户能够修改平台设置、审核评论、管理用户 +- 权限边界不清晰,存在安全隐患 + +### 解决方案 + +#### 后端路由保护 ([main.go](main.go)) +为所有管理功能添加 `AdminRequired` 中间件: + +```go +// 整个 /admin 路径要求管理员权限 +admin := router.Group("/admin") +admin.Use(middleware.AuthRequired(), middleware.AdminRequired(db)) + +// 评论管理要求管理员权限 +comments := router.Group("/admin/comments") +comments.Use(middleware.AuthRequired(), middleware.AdminRequired(db)) + +// 用户管理要求管理员权限 +users := router.Group("/admin/users") +users.Use(middleware.AuthRequired(), middleware.AdminRequired(db)) + +// 平台设置要求管理员权限 +settings := router.Group("/admin/settings") +settings.Use(middleware.AuthRequired(), middleware.AdminRequired(db)) + +// 附件管理要求管理员权限 +attachments := router.Group("/admin/articles") +attachments.Use(middleware.AuthRequired(), middleware.AdminRequired(db)) +``` + +#### 前端UI控制 +**头部导航菜单** ([templates/layouts/base.html](templates/layouts/base.html)): +- 所有用户:个人信息、我的文章 +- 仅管理员:后台管理(分隔线后显示) + +**管理后台仪表板** ([templates/admin/dashboard.html](templates/admin/dashboard.html)): +- 管理员专属按钮:用户管理、评论管理、平台设置 + +## 2. 用户文章管理功能 + +### 新增功能 +为普通用户创建独立的文章管理界面,无需访问后台即可管理自己的文章。 + +### 路由设计 ([main.go](main.go)) +```go +myArticles := router.Group("/my") +myArticles.Use(middleware.AuthRequired()) +{ + myArticles.GET("/articles", handlers.MyArticlesPage(db)) + myArticles.GET("/articles/new", handlers.MyArticleCreatePage(db)) + myArticles.POST("/articles/new", handlers.MyArticleCreate(db)) + myArticles.GET("/articles/:id/edit", handlers.MyArticleEditPage(db)) + myArticles.POST("/articles/:id/edit", handlers.MyArticleUpdate(db)) + myArticles.POST("/articles/:id/delete", handlers.MyArticleDelete(db)) +} + +// 用户文章附件管理 +myAttachments := router.Group("/my/articles") +myAttachments.Use(middleware.AuthRequired()) +{ + myAttachments.POST("/attachments", handlers.UploadAttachment(db, cfg.Path)) + myAttachments.POST("/attachments/:id/delete", handlers.DeleteAttachment(db, cfg.Path)) + myAttachments.GET("/:id/attachments", handlers.ListAttachments(db)) +} +``` + +### Handler实现 ([handlers/my_articles.go](handlers/my_articles.go)) + +**权限控制特点**: +- `MyArticlesPage`: 只查询当前用户的文章 (`WHERE author_id = ?`) +- `MyArticleEditPage`: 验证文章所有权 (`WHERE id = ? AND author_id = ?`) +- `MyArticleUpdate`: 验证文章所有权后才允许更新 +- `MyArticleDelete`: 验证文章所有权后才允许删除 + +### 模板文件 + +**文章列表** ([templates/user/my_articles.html](templates/user/my_articles.html)): +- 显示用户自己的文章 +- 支持创建、编辑、删除操作 +- 显示文章状态(草稿/已发布/置顶) + +**文章编辑器** ([templates/user/my_article_form.html](templates/user/my_article_form.html)): +- Markdown编辑器支持 +- 标题、slug、摘要、正文、封面 +- 状态选择(草稿/发布) +- 置顶选项 + +### 国际化支持 ([i18n/i18n.go](i18n/i18n.go)) + +新增翻译key: +```go +// 英文 +"my_articles": "My Articles", +"my_articles_title": "My Articles", +"comment_manage": "Manage Comments", +"article_field_*": // 表单字段标签 +"article_save": "Save", +"article_cancel": "Cancel", + +// 中文 +"my_articles": "我的文章", +"my_articles_title": "我的文章", +"comment_manage": "评论管理", +// ... +``` + +## 3. 权限矩阵 + +| 功能 | 路径 | admin | author | 未登录 | +|------|------|-------|--------|--------| +| 管理后台 | `/admin` | ✓ | ✗ | ✗ | +| 文章管理(后台) | `/admin/articles` | ✓ | ✗ | ✗ | +| 评论管理 | `/admin/comments` | ✓ | ✗ | ✗ | +| 用户管理 | `/admin/users` | ✓ | ✗ | ✗ | +| 平台设置 | `/admin/settings` | ✓ | ✗ | ✗ | +| **我的文章** | `/my/articles` | ✓ | ✓ | ✗ | +| 个人资料 | `/profile` | ✓ | ✓ | ✗ | +| 文章浏览 | `/article/:slug` | ✓ | ✓ | ✓ | + +## 4. 用户体验 + +### 普通用户(author) +1. 登录后点击头像 +2. 看到选项: + - 个人信息 + - **我的文章** ← 新增 + - 退出登录 +3. 点击"我的文章"进入独立的文章管理界面 +4. 可以创建、编辑、删除自己的文章 +5. 无法访问后台管理功能 + +### 管理员(admin) +1. 登录后点击头像 +2. 看到选项: + - 个人信息 + - 我的文章 + - ---(分隔线)--- + - **后台管理** ← 管理员专属 + - 退出登录 +3. 点击"后台管理"进入完整的管理后台 +4. 后台仪表板显示管理员专属按钮: + - 用户管理 + - 评论管理 + - 平台设置 + +## 5. 安全改进 + +### 多层防护 +1. **路由层**:`AdminRequired` 中间件拦截未授权访问 +2. **Handler层**:查询时验证用户身份和所有权 +3. **UI层**:根据角色隐藏不该显示的按钮和链接 + +### 拦截行为 +- 普通用户访问 `/admin/*` → 重定向到 `/admin` +- 由于 `/admin` 也需要管理员权限 → 再次重定向到 `/admin` +- 实际效果:普通用户无法访问任何管理功能 + +## 6. 测试建议 + +### 管理员账户测试 +```bash +# 登录管理员 +访问 http://localhost:8080/login +用户名: admin +密码: (你的管理员密码) + +# 应该能访问: +- /admin (后台仪表板) +- /admin/articles (文章管理) +- /admin/comments (评论管理) +- /admin/users (用户管理) +- /admin/settings/site (平台设置) +- /my/articles (我的文章) +``` + +### 普通用户测试 +```bash +# 创建或登录普通用户 +访问 http://localhost:8080/login +用户名: author +密码: (普通用户密码) + +# 应该能访问: +- /my/articles (我的文章) +- /profile (个人资料) + +# 不应该能访问(会被拦截): +- /admin +- /admin/comments +- /admin/users +- /admin/settings +``` + +## 7. 文件变更清单 + +### 新增文件 +- `handlers/my_articles.go` - 用户文章管理handler +- `templates/user/my_articles.html` - 文章列表模板 +- `templates/user/my_article_form.html` - 文章编辑表单 +- `test_permissions.md` - 权限测试文档 + +### 修改文件 +- `main.go` - 添加权限中间件和用户文章路由 +- `i18n/i18n.go` - 添加翻译key +- `templates/layouts/base.html` - 简化导航菜单 +- `templates/admin/dashboard.html` - 添加管理员专属按钮 + +## 8. 后续改进建议 + +1. **细粒度权限**:考虑添加编辑角色,可以编辑所有文章但不能管理用户 +2. **文章协作**:允许管理员指定文章的协作者 +3. **审计日志**:记录敏感操作(用户管理、设置修改) +4. **草稿分享**:生成草稿预览链接,方便审稿 +5. **文章统计**:在"我的文章"页面显示阅读量、评论数等统计数据