middleware.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package middleWare
  2. import (
  3. "fmt"
  4. "gfast/app/model/admin/auth_rule"
  5. "gfast/app/service/admin/auth_service"
  6. "gfast/app/service/admin/user_service"
  7. "gfast/app/service/casbin_adapter_service"
  8. "gfast/library/response"
  9. "gfast/library/service"
  10. "github.com/gogf/gf/frame/g"
  11. "github.com/gogf/gf/net/ghttp"
  12. "github.com/gogf/gf/text/gstr"
  13. "github.com/gogf/gf/util/gconv"
  14. )
  15. //跨域处理中间件
  16. func CORS(r *ghttp.Request) {
  17. r.Response.CORSDefault()
  18. r.Middleware.Next()
  19. }
  20. //权限判断处理中间件
  21. func Auth(r *ghttp.Request) {
  22. /*if r.Method != "GET" {
  23. response.FailJson(true, r, "演示系统禁止操作")
  24. }*/
  25. accessParams := r.GetStrings("accessParams")
  26. accessParamsStr := ""
  27. if len(accessParams) > 0 && accessParams[0] != "undefined" {
  28. accessParamsStr = "?" + gstr.Join(accessParams, "&")
  29. }
  30. //获取登陆用户id
  31. adminId := user_service.GetLoginID(r)
  32. //获取无需验证权限的用户id
  33. for _, v := range service.NotCheckAuthAdminIds {
  34. if gconv.Uint64(v) == adminId {
  35. r.Middleware.Next()
  36. return
  37. }
  38. }
  39. url := gstr.TrimLeft(r.Request.URL.Path, "/") + accessParamsStr
  40. //获取地址对应的菜单id
  41. menuList, err := auth_service.GetMenuIsStatusList()
  42. if err != nil {
  43. g.Log().Error(err)
  44. response.FailJson(true, r, "请求数据失败")
  45. }
  46. var menu *auth_rule.Entity
  47. for _, m := range menuList {
  48. ms := gstr.SubStr(m.Name, 0, gstr.Pos(m.Name, "?"))
  49. if m.Name == url || ms == url {
  50. menu = m
  51. break
  52. }
  53. }
  54. //只验证存在数据库中的规则
  55. if menu != nil {
  56. //若存在不需要验证的条件则跳过
  57. if gstr.Equal(menu.Condition, "nocheck") {
  58. r.Middleware.Next()
  59. return
  60. }
  61. menuId := menu.Id
  62. //菜单没存数据库不验证权限
  63. if menuId != 0 {
  64. //判断权限操作
  65. enforcer, err := casbin_adapter_service.GetEnforcer()
  66. if err != nil {
  67. g.Log().Error(err)
  68. response.FailJson(true, r, "获取权限失败")
  69. }
  70. groupPolicy := enforcer.GetFilteredGroupingPolicy(0,
  71. fmt.Sprintf("u_%d", adminId))
  72. if len(groupPolicy) == 0 {
  73. response.FailJson(true, r, "没有访问权限")
  74. }
  75. hasAccess := false
  76. for _, v := range groupPolicy {
  77. if enforcer.HasPolicy(v[1], fmt.Sprintf("r_%d", menuId), "All") {
  78. hasAccess = true
  79. break
  80. }
  81. }
  82. if !hasAccess {
  83. response.FailJson(true, r, "没有访问权限")
  84. }
  85. }
  86. } else if menu == nil && accessParamsStr != "" {
  87. response.FailJson(true, r, "没有访问权限")
  88. }
  89. r.Middleware.Next()
  90. }