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 协议》,转载必须注明作者和本文链接
推荐文章: