Files
AskaEth bc8b1ee6c0 feat: M3-M7 全模块落地 + 集成接线
- M3 认证/权限/审计/限流 + 全部 REST 接口
- M4 管理面板(MIUIx + 成绩录入/积分榜下钻/大屏控制)
- M5a 大屏页面(六页 + 明细覆盖层 + 缩放适配)
- M6 WebSocket 实时同步中心
- M7 xlsx 导出 + 赛事包 zip + 备份
- 规则包 YAML 导入导出(差异预览)
- 字体 vendor 子集化(4 套 x2 字重)
- 集成:realtime/export/rules 接入 main+httpapi;backup 子命令
- 修复:中间件包装 ResponseWriter 丢失 Hijacker,导致 WS 握手 501
2026-09-09 19:02:24 +08:00

50 lines
1.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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) }