auth.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package middleware
  2. import (
  3. "strings"
  4. "github.com/casdoor/casdoor-go-sdk/casdoorsdk"
  5. "github.com/gofiber/fiber/v2"
  6. )
  7. // AuthMiddleware 认证中间件
  8. // 可选参数 requiredRoles:若不为空,将检查用户角色是否包含其中之一
  9. func AuthMiddleware(requiredRoles ...string) fiber.Handler {
  10. return func(c *fiber.Ctx) error {
  11. authHeader := c.Get("Authorization")
  12. if authHeader == "" {
  13. return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
  14. "code": 401,
  15. "msg": "Missing Authorization header",
  16. })
  17. }
  18. // 解析 Bearer Token
  19. tokenString := strings.TrimPrefix(authHeader, "Bearer ")
  20. if tokenString == authHeader {
  21. return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
  22. "code": 401,
  23. "msg": "Invalid token format",
  24. })
  25. }
  26. // 验证 JWT & 提取 claims
  27. claims, err := casdoorsdk.ParseJwtToken(tokenString)
  28. if err != nil {
  29. return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
  30. "code": 401,
  31. "msg": "Invalid or expired token",
  32. })
  33. }
  34. // 检查角色(可选)
  35. if len(requiredRoles) > 0 {
  36. for _, userRole := range claims.User.Roles {
  37. authorized := false
  38. for _, r := range requiredRoles {
  39. if userRole.Name == r {
  40. authorized = true
  41. break
  42. }
  43. }
  44. if !authorized {
  45. return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
  46. "code": 403,
  47. "msg": "Forbidden: insufficient role",
  48. })
  49. }
  50. }
  51. }
  52. // 注入用户信息
  53. c.Locals("user", claims)
  54. return c.Next()
  55. }
  56. }