middleware.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * @desc:中间件
  3. * @company:云南奇讯科技有限公司
  4. * @Author: yixiaohu<yxh669@qq.com>
  5. * @Date: 2022/3/17 9:17
  6. */
  7. package service
  8. import (
  9. "fmt"
  10. "github.com/gogf/gf/v2/frame/g"
  11. "github.com/gogf/gf/v2/net/ghttp"
  12. "github.com/gogf/gf/v2/text/gstr"
  13. "github.com/gogf/gf/v2/util/gconv"
  14. commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
  15. "github.com/tiger1103/gfast/v3/internal/app/system/model"
  16. "github.com/tiger1103/gfast/v3/library/libResponse"
  17. )
  18. type IMiddleware interface {
  19. Ctx(r *ghttp.Request)
  20. Auth(r *ghttp.Request)
  21. }
  22. type middlewareImpl struct{}
  23. var middleService = middlewareImpl{}
  24. func Middleware() IMiddleware {
  25. return &middleService
  26. }
  27. // Ctx 自定义上下文对象
  28. func (s *middlewareImpl) Ctx(r *ghttp.Request) {
  29. ctx := r.GetCtx()
  30. // 初始化登录用户信息
  31. data, err := GfToken().ParseToken(r)
  32. if err != nil {
  33. // 执行下一步请求逻辑
  34. r.Middleware.Next()
  35. }
  36. if data != nil {
  37. context := new(model.Context)
  38. err = gconv.Struct(data.Data, &context.User)
  39. if err != nil {
  40. g.Log().Error(ctx, err)
  41. // 执行下一步请求逻辑
  42. r.Middleware.Next()
  43. }
  44. Context().Init(r, context)
  45. }
  46. // 执行下一步请求逻辑
  47. r.Middleware.Next()
  48. }
  49. // Auth 权限判断处理中间件
  50. func (s *middlewareImpl) Auth(r *ghttp.Request) {
  51. ctx := r.GetCtx()
  52. //获取登陆用户id
  53. adminId := Context().GetUserId(ctx)
  54. accessParams := r.Get("accessParams").Strings()
  55. accessParamsStr := ""
  56. if len(accessParams) > 0 && accessParams[0] != "undefined" {
  57. accessParamsStr = "?" + gstr.Join(accessParams, "&")
  58. }
  59. url := gstr.TrimLeft(r.Request.URL.Path, "/") + accessParamsStr
  60. /*if r.Method != "GET" && adminId != 1 && url!="api/v1/system/login" {
  61. libResponse.FailJson(true, r, "对不起!演示系统,不能删改数据!")
  62. }*/
  63. //获取无需验证权限的用户id
  64. tagSuperAdmin := false
  65. User().NotCheckAuthAdminIds(ctx).Iterator(func(v interface{}) bool {
  66. if gconv.Uint64(v) == adminId {
  67. tagSuperAdmin = true
  68. return false
  69. }
  70. return true
  71. })
  72. if tagSuperAdmin {
  73. r.Middleware.Next()
  74. //不要再往后面执行
  75. return
  76. }
  77. //获取地址对应的菜单id
  78. menuList, err := Rule().GetMenuList(ctx)
  79. if err != nil {
  80. g.Log().Error(ctx, err)
  81. libResponse.FailJson(true, r, "请求数据失败")
  82. }
  83. var menu *model.SysAuthRuleInfoRes
  84. for _, m := range menuList {
  85. ms := gstr.SubStr(m.Name, 0, gstr.Pos(m.Name, "?"))
  86. if m.Name == url || ms == url {
  87. menu = m
  88. break
  89. }
  90. }
  91. //只验证存在数据库中的规则
  92. if menu != nil {
  93. //若存在不需要验证的条件则跳过
  94. if gstr.Equal(menu.Condition, "nocheck") {
  95. r.Middleware.Next()
  96. return
  97. }
  98. menuId := menu.Id
  99. //菜单没存数据库不验证权限
  100. if menuId != 0 {
  101. //判断权限操作
  102. enforcer, err := commonService.CasbinEnforcer(ctx)
  103. if err != nil {
  104. g.Log().Error(ctx, err)
  105. libResponse.FailJson(true, r, "获取权限失败")
  106. }
  107. hasAccess := false
  108. hasAccess, err = enforcer.Enforce(fmt.Sprintf("%s%d", userService.CasBinUserPrefix, adminId), gconv.String(menuId), "All")
  109. if err != nil {
  110. g.Log().Error(ctx, err)
  111. libResponse.FailJson(true, r, "判断权限失败")
  112. }
  113. if !hasAccess {
  114. libResponse.FailJson(true, r, "没有访问权限")
  115. }
  116. }
  117. } else if menu == nil && accessParamsStr != "" {
  118. libResponse.FailJson(true, r, "没有访问权限")
  119. }
  120. r.Middleware.Next()
  121. }