90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
package middleware
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"yintai-api/app/common/cache"
|
|
err2 "yintai-api/app/common/err"
|
|
"yintai-api/app/common/model"
|
|
"yintai-api/app/common/utils"
|
|
"yintai-api/base/global"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func Login(c *gin.Context) {
|
|
token := c.Request.Header.Get("token")
|
|
token = strings.TrimSpace(token)
|
|
if token == "" {
|
|
err2.TokenErr("<login middleware> token not exists")
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
key := cache.NewKeys().User() + token
|
|
if res := global.GetRedis().Get(key); res.Val() == "" {
|
|
err2.TokenErr("<login middleware> token not exists", res.Err())
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
c.Next()
|
|
}
|
|
|
|
// Permission user router permission check
|
|
func Permission() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
token := c.Request.Header.Get("token")
|
|
token = strings.TrimSpace(token)
|
|
if token == "" {
|
|
err2.TokenErr("<permission middleware> token not exists")
|
|
c.Abort()
|
|
return
|
|
}
|
|
key := cache.NewKeys().User() + token
|
|
val := global.GetRedis().Get(key).Val()
|
|
if val == "" {
|
|
err2.TokenErr("<permission middleware> token not exists")
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
var user *model.UserWithRole
|
|
err := json.Unmarshal([]byte(val), &user)
|
|
if err != nil {
|
|
err2.TokenErr("<permission middleware> token not exists")
|
|
}
|
|
|
|
key = cache.NewKeys().Api(user.RoleID)
|
|
member := utils.SourceFormat(c.Request.Method, c.FullPath())
|
|
// skip no auth
|
|
if noAuth(member) {
|
|
c.Next()
|
|
}
|
|
|
|
if val := global.GetRedis().SIsMember(key, member); !val.Val() {
|
|
err2.PriErr("<permission middleware> no permission", val.Err())
|
|
c.Abort()
|
|
return
|
|
}
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
// 不需要鉴权的接口
|
|
func noAuth(source string) bool {
|
|
type no struct {
|
|
Method string
|
|
Url string
|
|
}
|
|
x := make([]no, 0)
|
|
x = append(x, no{"POST", "/yt/user/login"})
|
|
for _, v := range x {
|
|
if source == utils.SourceFormat(v.Method, v.Url) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|