Golang登录状态管理库 - Token-go的使用指南

Golang登录状态管理库 - Token-go的使用指南 Github: weloe/token-go: 一个登录认证库。

它能做什么? 这个库专注于解决登录认证问题,例如:登录、多账户登录、共享令牌登录、令牌刷新、双令牌刷新、二维码登录、登出、踢出、封禁、二次认证、临时令牌、单点登录…… 使用这个库可以简化认证和授权业务,只需几行代码即可实现上述业务。 一些使用示例: 登录

token, err := enforcer.Login("1", tokenGo.NewHttpContext(req, w))

登出

err := enforcer.Logout(tokenGo.NewHttpContext(req, w))

封禁

err = enforcer.Banned("1", "test", 1, 100)

检查登录状态

b, err := enforcer.IsLogin(tokenGo.NewHttpContext(req, w))

特性

  • 多种登录策略:多账户系统登录、同端登录、同端互斥登录、多端登录、多端互斥登录、扫码登录、单点登录。
  • 权限认证功能,例如临时令牌、二级认证、角色认证和权限认证。
  • 多种用户会话管理方式,例如强制登出、踢人下线、账户封禁、令牌自动续期和双令牌续期。
  • 扩展:redisAdapter…

更多关于Golang登录状态管理库 - Token-go的使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang登录状态管理库 - Token-go的使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Token-go 是一个设计精良的Go语言登录状态管理库,它通过封装复杂的会话逻辑,为Web应用提供了简洁而强大的认证授权能力。以下是对其核心功能的使用指南和代码示例。

1. 核心概念与初始化

首先,你需要创建一个Enforcer实例,它是所有操作的核心。

import (
    "github.com/weloe/token-go"
    "github.com/weloe/token-go/config"
)

func main() {
    // 创建配置,通常从配置文件或环境变量加载
    conf := &config.Config{
        SecretKey: "your-secret-key", // 用于签名Token的密钥
        Timeout:   3600,              // Token默认超时时间(秒)
    }
    
    // 创建Enforcer实例
    enforcer, err := tokenGo.NewEnforcer(conf)
    if err != nil {
        panic(err)
    }
    
    // 通常会将enforcer保存为全局变量或通过依赖注入使用
}

2. 登录与令牌管理

登录操作会创建会话并返回令牌。

func loginHandler(w http.ResponseWriter, req *http.Request) {
    // 假设验证用户名密码后获得用户ID "user123"
    userID := "user123"
    
    // 执行登录,创建会话
    token, err := enforcer.Login(userID, tokenGo.NewHttpContext(req, w))
    if err != nil {
        http.Error(w, "登录失败", http.StatusInternalServerError)
        return
    }
    
    // token会自动通过Cookie或响应头返回给客户端
    // 你也可以手动处理它
    w.Write([]byte("登录成功,Token: " + token))
}

3. 会话状态检查与登出

中间件是检查登录状态的常见模式。

func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        ctx := tokenGo.NewHttpContext(r, w)
        
        // 检查是否已登录
        isLogin, err := enforcer.IsLogin(ctx)
        if err != nil || !isLogin {
            http.Error(w, "未授权", http.StatusUnauthorized)
            return
        }
        
        // 获取当前登录的用户ID
        loginID, err := enforcer.GetLoginID(ctx)
        if err != nil {
            http.Error(w, "会话异常", http.StatusInternalServerError)
            return
        }
        
        // 可以将用户ID存入请求上下文,供后续处理使用
        ctxWithUser := context.WithValue(r.Context(), "userID", loginID)
        next.ServeHTTP(w, r.WithContext(ctxWithUser))
    }
}

// 受保护的路由
func profileHandler(w http.ResponseWriter, r *http.Request) {
    userID := r.Context().Value("userID").(string)
    w.Write([]byte("用户 " + userID + " 的个人资料"))
}

// 登出
func logoutHandler(w http.ResponseWriter, r *http.Request) {
    err := enforcer.Logout(tokenGo.NewHttpContext(r, w))
    if err != nil {
        http.Error(w, "登出失败", http.StatusInternalServerError)
        return
    }
    w.Write([]byte("已登出"))
}

4. 高级会话控制

库提供了丰富的会话管理功能。

// 封禁用户
// 将用户"user123"在"login"业务场景下封禁100秒
err := enforcer.Banned("user123", "login", 1, 100)

// 踢出用户(强制使其所有会话下线)
err := enforcer.Kickout("user123")

// 检查用户是否被封禁
isBanned, err := enforcer.IsBanned("user123", "login")

5. 适配器与持久化

默认使用内存存储,生产环境建议使用Redis适配器。

import (
    "github.com/weloe/token-go/redisadapter"
    "github.com/go-redis/redis/v8"
)

func main() {
    // 创建Redis客户端
    redisOpts := &redis.Options{
        Addr: "localhost:6379",
    }
    
    // 创建Redis适配器
    adapter, err := redisadapter.NewAdapter(redisOpts)
    if err != nil {
        panic(err)
    }
    
    // 使用适配器创建Enforcer
    conf := &config.Config{
        SecretKey: "your-secret-key",
        Timeout:   3600,
        Adapter:   adapter, // 注入Redis适配器
    }
    
    enforcer, err := tokenGo.NewEnforcer(conf)
    if err != nil {
        panic(err)
    }
}

6. 多账户系统与登录策略

库支持复杂的多账户场景。

// 以不同身份登录同一设备(多账户系统登录)
token1, err := enforcer.Login("user123", tokenGo.NewHttpContext(req, w))
token2, err := enforcer.Login("admin456", tokenGo.NewHttpContext(req, w))

// 配置同端互斥登录(同一类型设备只允许一个会话)
conf := &config.Config{
    SecretKey: "your-secret-key",
    Timeout:   3600,
    LoginModel: tokenGo.LoginModelKick, // 新登录会踢掉旧会话
}

7. 权限验证示例

库内置了角色和权限验证支持。

// 为用户添加角色和权限
enforcer.AddRoleForUser("user123", "admin")
enforcer.AddPermissionForUser("user123", "article:delete")

// 验证权限
hasPerm, err := enforcer.HasPermission("user123", "article:delete")
if hasPerm {
    // 允许执行删除操作
}

// 临时令牌(用于一次性操作)
tempToken, err := enforcer.CreateTempToken("user123", 300) // 5分钟有效

Token-go通过合理的默认配置和清晰的API设计,显著降低了在Go中实现专业级认证系统的复杂度。其模块化设计也便于根据具体需求进行定制和扩展。

回到顶部