package auth import ( "github.com/gin-gonic/gin" "net/http" "strings" "sync" "vamicro/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) } } var noTokenUrls = []string{ "/data/api-v/gb28181/findAreaByParentId", "/data/api-v/sysinit/getInitInfo", "/data/api-v/sysinit/savePassword", "/data/api-v/sysinit/networkList", "/data/api-v/sysinit/initNetwork", "/data/api-v/sysinit/saveRegInfo", "/data/api-v/sysinit/getRegInfo", "/data/api-u/sys/logout", } 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/") && !util.ArrayContains(noTokenUrls, urlPath) && !strings.Contains(urlPath, "/data/api-v/token") { //Oauth2检查 token,err := Oauth2Serv.ValidationBearerToken(c.Request) if nil == err { if !CheckAcl(urlPath) { c.JSON(401, gin.H{ "code": 401, "success": false, "msg": "接口暂未开放", "data": "", }) c.Abort() return } c.Request.Header.Set("Login_user_id", token.GetUserID()) c.Next() //fmt.Print(token.GetUserID()) return } else { //fmt.Println(err.Error()) } jwtDriver :=NewJwtAuthDriver() if !jwtDriver.Check(c) { c.JSON(401, gin.H{ "code": 401, "success": false, "msg": "请求未携带Token,无权访问", "data": "", }) c.Abort() return } userM := (*jwtDriver).User(c) if userM == nil { c.JSON(401, gin.H{ "code": 401, "success": false, "msg": "请求未携带Token,无权访问", "data": "", }) c.Abort() return } userId := userM["id"].(string) if OutUser(userId) { c.JSON(401, gin.H{ "code": 401, "success": false, "msg": "请求未携带Token,无权访问", "data": "", }) c.Abort() return } c.Request.Header.Set("Login_user_id", userId) c.Next() } else { c.Next() } } } func GetCurUser(c *gin.Context)map[string]interface{}{ return (*GenerateAuthDriver()).User(c) }