satoken 封装 sa-token-go 初始化与鉴权(JWT、读 Cookie+Body、Redis 存会话);loginhelper 封装登录态存取,负责 token session 与 account session 的双写。权限码校验由 CheckPermission(OR 语义)中间件完成。
关键导出
satoken.Init()按config.SAToken+ 包级 Redis 构建 Managersatoken.Manager() *sagin.Managersatoken.CheckPermission(perms ...string) gin.HandlerFunc(OR 语义,失败c.Error+ 403)satoken.CheckRole(roles ...string) gin.HandlerFuncloginhelper.Login(loginUser *model.LoginUser, device string) (string, error)签发 token、存 token session、双写 account session 权限/角色loginhelper.GetLoginUser(c) *model.LoginUser(按请求缓存进gin.Context,一次 Redis,只读)loginhelper.GetLoginUserByToken(token)/GetLoginID(c)/GetUserID(c) int64/GetUsername(c)/GetDeptID(c)loginhelper.IsSuperAdmin(id)/IsCurrentSuperAdmin(c)/IsLogin(c)loginhelper.LogoutUser(userID)/LogoutUsers([]userID)
典型用法
go
// internal/system/router.go:73
user.GET("/list", satoken.CheckPermission("system:user:list"), handler.UserApiApp.List)
// internal/auth/service/password_auth_strategy.go:64
token, err := loginhelper.Login(loginUser, client.DeviceType)坑/约定
WARNING
Login把*LoginUser存为 JSON 串( 非指针),取回要json.Unmarshal。- 权限/角色是 account session,与 token session 的 loginUser 两套存储, 必须双写否则权限码恒判否。
- 超管的
*:*:*写入侧转成*(sa-token 对*:*:*前缀匹配有 bug),LoginUser.MenuPermission仍保持*:*:*给前端。 GetLoginUser返回的指针是请求内共享, 调用方只读不改。LogoutUser只注销 default 设备的会话。 :::
相关页:/migration/sa-token、/architecture/request-flow、/pkg-reference/jsonx-snowflake。