多用户与角色:owner / admin / reader 三级,用户管理页 + 密码上库

- users 表加 password_hash 列;后台账号(owner+admin)密码 bcrypt 存行内,
  首次登录把 env / settings 引导凭据自迁移成行哈希
- 会话 token 从用户名改为携带用户 ID,角色与停用状态每请求查库,
  改角色 / 停用账号即时生效(存量会话立即 401)
- 登录:先查 users 表,再走 settings 哈希 / env 引导链;
  admin/admin 开发模式在任何账号设过密码后失效
- 权限:系统设置、用户管理仅 owner;内容管理 admin+owner;
  admin 后台新增 用户 页(创建 / 重置密码 / 停用 / 删除),
  设置页「登录与存储」tab 对管理员隐藏
- 账户页加修改密码表单(旧密码校验,OAuth/Passkey 首设免旧密码);
  评论区管理员身份跟随各自账号,不再统一挂站主名下
- 修复:providers 为 nil 时账户页白屏(Go nil slice 序列化成 null)
This commit is contained in:
Sakurasan committed 2026-10-01 22:35:37 +08:00
1 parent e5dee4daf1
commit 4bb2ff4145
23 files changed
+917 -222

No files matched your search

+8 -2
View File
@@ -264,9 +264,11 @@ type Settings struct {
AdminPasswordHash string `json:"-"`
}
// 账号角色。owner 全库唯一(站主),reader 是评论区登录进来的访客。
// 账号角色。owner 全库唯一(站主),admin 是站主在后台创建的内容管理员
// (可管内容、不可动系统设置与用户),reader 是评论区登录进来的访客。
const (
RoleOwner = "owner"
RoleAdmin = "admin"
RoleReader = "reader"
)
@@ -281,8 +283,12 @@ type Reader struct {
AvatarURL string `json:"avatar_url"`
URL string `json:"url"`
Banned bool `json:"banned"`
// Role 区分站主与访客:绑定到 owner 的第三方身份登录时会话升级为管理员。
// Role 区分站主、内容管理员与访客:绑定到 owner 的第三方身份登录时
// 会话升级为管理员。
Role string `json:"role"`
// PasswordHash 只属于后台账号(provider=admin,owner/admin 两级),
// bcrypt 哈希从不离开服务端;reader 恒为空串。
PasswordHash string `json:"-"`
// CommentCount 是累计评论数(后台用户列表展示用)
CommentCount int64 `json:"comment_count"`
CreatedAt string `json:"created_at"`