- M3 认证/权限/审计/限流 + 全部 REST 接口 - M4 管理面板(MIUIx + 成绩录入/积分榜下钻/大屏控制) - M5a 大屏页面(六页 + 明细覆盖层 + 缩放适配) - M6 WebSocket 实时同步中心 - M7 xlsx 导出 + 赛事包 zip + 备份 - 规则包 YAML 导入导出(差异预览) - 字体 vendor 子集化(4 套 x2 字重) - 集成:realtime/export/rules 接入 main+httpapi;backup 子命令 - 修复:中间件包装 ResponseWriter 丢失 Hijacker,导致 WS 握手 501
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
// Package auth 提供用户、会话与权限模型。
|
||
//
|
||
// 角色是包含关系:admin ⊇ recorder ⊇ guest;guest 是「未登录」的默认身份,
|
||
// 不落库(见 devdocs/08-安全与可靠性 第 2 节)。
|
||
package auth
|
||
|
||
import "strings"
|
||
|
||
// Role 是权限角色。
|
||
type Role string
|
||
|
||
const (
|
||
// RoleGuest 未登录访客:只读赛事数据,禁读系统配置。
|
||
RoleGuest Role = "guest"
|
||
// RoleRecorder 记录员:guest 全部 + 录入、发布、撤销、大屏控制。
|
||
RoleRecorder Role = "recorder"
|
||
// RoleAdmin 管理员:recorder 全部 + 系统配置、审计、备份。
|
||
RoleAdmin Role = "admin"
|
||
)
|
||
|
||
func roleRank(r Role) int {
|
||
switch r {
|
||
case RoleAdmin:
|
||
return 2
|
||
case RoleRecorder:
|
||
return 1
|
||
default:
|
||
return 0
|
||
}
|
||
}
|
||
|
||
// Allows 报告 r 是否覆盖 need,即 admin ⊇ recorder ⊇ guest。
|
||
func (r Role) Allows(need Role) bool {
|
||
return roleRank(r) >= roleRank(need)
|
||
}
|
||
|
||
// ParseRole 把数据库里的角色字符串收敛成已知角色;未知值按最低权限处理。
|
||
func ParseRole(s string) Role {
|
||
switch Role(strings.ToLower(strings.TrimSpace(s))) {
|
||
case RoleAdmin:
|
||
return RoleAdmin
|
||
case RoleRecorder:
|
||
return RoleRecorder
|
||
default:
|
||
return RoleGuest
|
||
}
|
||
}
|
||
|
||
func (r Role) String() string { return string(r) }
|