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{})interface{} Logout(http *http.Request,w http.ResponseWriter) bool } 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) }