package auth
|
|
import (
|
"github.com/gin-gonic/gin"
|
"net/http"
|
"strings"
|
"sync"
|
"webserver/extend/code"
|
"webserver/extend/util"
|
)
|
|
const (
|
TokenKey = "abc123456789"
|
)
|
|
type Auth interface {
|
Check(c *gin.Context)bool
|
User(c *gin.Context)map[string]interface{}
|
Login(http *http.Request,w http.ResponseWriter,user map[string]interface{}) (bool, string, string)
|
Logout(http *http.Request,w http.ResponseWriter) bool
|
RefreshToken(tokenStr string) (bool, string, string)
|
}
|
|
func GenerateAuthDriver() *Auth {
|
var authDriver Auth
|
authDriver = NewJwtAuthDriver()
|
return &authDriver
|
}
|
|
var outUserM = make(map[string]string,0)
|
var lock sync.RWMutex
|
|
func SetOutUser(userId string) {
|
lock.Lock()
|
defer lock.Unlock()
|
outUserM[userId] = userId
|
}
|
|
func OutUser(userId string) bool {
|
lock.Lock()
|
defer lock.Unlock()
|
if _,ok := outUserM[userId];ok{
|
return true
|
}
|
return false
|
}
|
|
func RemoveOutUser(userId string) {
|
lock.Lock()
|
defer lock.Unlock()
|
if _,ok := outUserM[userId];ok{
|
delete(outUserM,userId)
|
}
|
}
|
|
func AuthHandler() gin.HandlerFunc {
|
return func(c *gin.Context) {
|
urlPath := c.Request.URL.Path
|
|
if strings.Contains(urlPath,"/data/api-") && !strings.Contains(urlPath,"login") && !strings.Contains(urlPath, "/data/api-v/license") && !strings.Contains(urlPath, "/data/api-v/info/"){
|
jwtDriver :=NewJwtAuthDriver()
|
if !jwtDriver.Check(c) {
|
util.ResponseFormat(c,code.TokenNotFound,"尚未登录,请登录")
|
c.Abort()
|
return
|
}
|
userM := (*jwtDriver).User(c)
|
if userM == nil {
|
util.ResponseFormat(c,code.TokenNotFound,"尚未登录,请登录")
|
c.Abort()
|
return
|
}
|
userId := userM["id"].(string)
|
if OutUser(userId) {
|
util.ResponseFormat(c,code.TokenNotFound,"尚未登录,请登录")
|
c.Abort()
|
return
|
}
|
c.Next()
|
} else {
|
c.Next()
|
}
|
}
|
}
|
|
func GetCurUser(c *gin.Context)map[string]interface{}{
|
return (*GenerateAuthDriver()).User(c)
|
}
|