Skip to content

satoken 封装 sa-token-go 初始化与鉴权(JWT、读 Cookie+Body、Redis 存会话);loginhelper 封装登录态存取,负责 token session 与 account session 的双写。权限码校验由 CheckPermission(OR 语义)中间件完成。

关键导出

  • satoken.Init()config.SAToken + 包级 Redis 构建 Manager
  • satoken.Manager() *sagin.Manager
  • satoken.CheckPermission(perms ...string) gin.HandlerFunc(OR 语义,失败 c.Error + 403)
  • satoken.CheckRole(roles ...string) gin.HandlerFunc
  • loginhelper.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

基于 MIT 协议开源