rabc.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package middleware
  2. import (
  3. "github.com/casbin/casbin/v2"
  4. "github.com/duke-git/lancet/v2/convertor"
  5. "github.com/gin-gonic/gin"
  6. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  7. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  8. "github.com/go-nunu/nunu-layout-advanced/pkg/jwt"
  9. "net/http"
  10. )
  11. func AuthMiddleware(e *casbin.SyncedEnforcer) gin.HandlerFunc {
  12. return func(ctx *gin.Context) {
  13. // 从上下文获取用户信息(假设通过 JWT 或其他方式设置)
  14. v, exists := ctx.Get("claims")
  15. if !exists {
  16. v1.HandleError(ctx, http.StatusUnauthorized, v1.ErrUnauthorized, nil)
  17. ctx.Abort()
  18. return
  19. }
  20. uid := v.(*jwt.MyCustomClaims).UserId
  21. if convertor.ToString(uid) == model.AdminUserID {
  22. // 防呆设计,超管跳过API权限检查
  23. ctx.Next()
  24. return
  25. }
  26. // 获取请求的资源和操作
  27. sub := convertor.ToString(uid)
  28. obj := model.ApiResourcePrefix + ctx.Request.URL.Path
  29. act := ctx.Request.Method
  30. // 检查权限
  31. allowed, err := e.Enforce(sub, obj, act)
  32. if err != nil {
  33. v1.HandleError(ctx, http.StatusForbidden, v1.ErrForbidden, nil)
  34. ctx.Abort()
  35. return
  36. }
  37. if !allowed {
  38. v1.HandleError(ctx, http.StatusForbidden, v1.ErrForbidden, nil)
  39. ctx.Abort()
  40. return
  41. }
  42. ctx.Next()
  43. }
  44. }