You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.5 KiB
Go

package middleware
import (
"fmt"
"mygo/conf"
"mygo/dbhelper"
"mygo/libs"
"mygo/utils"
"github.com/labstack/echo/v4"
)
func Access() echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
//在这里处理拦截请求的逻辑
jwtstr := c.QueryParam("jwt")
if jwtstr != "" {
jwtobj, err := libs.JWTDecrypt(jwtstr)
if !err || jwtobj == nil || jwtobj["token"] == nil || jwtobj["id"] == nil {
return c.JSON(401, map[string]interface{}{
"errcode": 2,
"errmsg": "jwt解析错误",
})
}
id, ok := jwtobj["id"].(string)
if !ok {
return c.JSON(401, map[string]interface{}{
"errcode": 2,
"errmsg": "用户信息获取失败",
})
}
if !conf.ISTEST {
redis := dbhelper.GetRedisDb()
key := fmt.Sprintf("%s:admin:token:%s", conf.APPNAME, id)
oldtoken, err1 := redis.Get(key).Result()
if err1 != nil {
return c.JSON(401, map[string]interface{}{
"errcode": 2,
"errmsg": "获取token失败",
})
}
if jwtobj["token"] != oldtoken {
return c.JSON(401, map[string]interface{}{
"errcode": 2,
"errmsg": "账户已经在其他终端登录",
})
}
}
c.QueryParams().Add("id", id)
} else {
ip := echo.ExtractIPFromXFFHeader()(c.Request())
ok := utils.IsInnerIp(ip)
if !ok {
return c.JSON(401, map[string]interface{}{
"errcode": 2,
"errmsg": "服务器繁忙,请稍后再试!",
})
}
}
return next(c)
}
}
}