go实现类似与spring的全局上下文获取getPrincipal()

import "github.com/cosmos72/gls"

/**
设置key-value
*/
func SetVal(key interface{}, val interface{}) {
    gls.Set(key, val)
}

/**
获取值
*/
func GetVal(key interface{}) string {
    v, ok := gls.Get(key)
    if ok {
        return v.(string)
    }
    return ""
}

使用方式,在jwt鉴权的时候将用户信息存入SetVal

/**
jwt鉴权
*/
func JWTAuthMiddleware() func(c *gin.Context) {
    return func(c *gin.Context) {
        uu := c.Request.URL
        //log.Infof("")
        //log.Infof("请求url = %s" ,uu.Path)

        //无需token请求url
        if IsContain(config.NO_TOKENS, uu.Path) {
            c.Next()
            return
        }

        //Log("uu", uu)
        // 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
        // 这里假设Token放在Header的Authorization中,并使用Bearer开头
        // 这里的具体实现方式要依据你的实际业务情况决定
        authHeader := c.Request.Header.Get("Authorization")
        if authHeader == "" {
            Fail(c, "请求头中Authorization为空")
            c.Abort()
            return
        }
        // 按空格分割
        //parts := strings.SplitN(authHeader, " ", 2)
        //if !(len(parts) == 2 && parts[0] == "Bearer") {
        // c.JSON(http.StatusOK, gin.H{
        //  "code": 2004,
        //  "msg":  "请求头中auth格式有误",
        // })
        // c.Abort()
        // return
        //}
        // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
        //mc, err := ParseToken(parts[1])

        mc, err := ParseToken(authHeader)
        if err != nil {
            //Log("无效的Token", err)
            Fail(c, "无效的token")
            c.Abort()
            return
        }
        //从redis中获取token信息
        result, err := config.RedisClient().Get(mc.UserName).Result()
        if err != nil {
            Fail(c, "获取token出错")
            c.Abort()
            return
        }
        tokenMap, err := JsonToMap(result)
        if err != nil {
            Fail(c, "获取token出错")
            c.Abort()
            return
        }
        if tokenMap["token"] != authHeader {
            Fail(c, "无效的token")
            c.Abort()
            return
        }
        // 将当前请求的username信息保存到请求的上下文c上
        c.Set("username", mc.UserName)
        config.SetVal("username", mc.UserName)
        c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息
    }

获取上下文,当前用户GetVal

//获取用户信息
func UserInfo() en.UserInfo {
    val := config.GetVal("username")
    if val != "" {
        user := mapper.QueryUserByPhoneNumber(val)
        return user
    }
    return en.UserInfo{}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!