auth.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package auth
  2. import (
  3. "exam_system/middleware/claims"
  4. result "exam_system/result"
  5. "net/http"
  6. "strings"
  7. "github.com/gin-gonic/gin"
  8. )
  9. func Auth() gin.HandlerFunc {
  10. return func(c *gin.Context) {
  11. // auth开头跳过
  12. if strings.HasPrefix(c.Request.RequestURI, "/auth") {
  13. c.Next()
  14. } else {
  15. // 授权
  16. tokenValidate(c)
  17. }
  18. }
  19. }
  20. func tokenValidate(c *gin.Context) {
  21. authHeader := c.Request.Header.Get("Authorization")
  22. if authHeader == "" {
  23. c.JSON(http.StatusUnauthorized, result.UNAUTHORIZED)
  24. c.Abort()
  25. return
  26. }
  27. // 按空格分割
  28. parts := strings.SplitN(authHeader, " ", 2)
  29. if !(len(parts) == 2 && parts[0] == "Bearer") {
  30. c.JSON(http.StatusUnauthorized, result.UNAUTHORIZED)
  31. c.Abort()
  32. return
  33. }
  34. // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
  35. mc, err := claims.ParseToken(parts[1])
  36. if err != nil {
  37. c.JSON(http.StatusUnauthorized, result.UNAUTHORIZED)
  38. c.Abort()
  39. return
  40. }
  41. // 将当前请求的username信息保存到请求的上下文c上
  42. c.Set("id", mc.Id)
  43. c.Set("sid", mc.Sid)
  44. c.Set("username", mc.Username)
  45. c.Set("role", mc.Role)
  46. c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信
  47. }