middleware.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. //glog.Debugf("adminId:%d", adminId)
  33. if adminId < 1 {
  34. response.FailJson(true, r, "没有访问权限")
  35. }
  36. //获取无需验证权限的用户id
  37. for _, v := range service.NotCheckAuthAdminIds {
  38. if gconv.Uint64(v) == adminId {
  39. r.Middleware.Next()
  40. return
  41. }
  42. }
  43. url := gstr.TrimLeft(r.Request.URL.Path, "/") + accessParamsStr
  44. //获取地址对应的菜单id
  45. menuList, err := auth_service.GetMenuIsStatusList()
  46. if err != nil {
  47. g.Log().Error(err)
  48. response.FailJson(true, r, "请求数据失败")
  49. }
  50. var menu *auth_rule.Entity
  51. for _, m := range menuList {
  52. ms := gstr.SubStr(m.Name, 0, gstr.Pos(m.Name, "?"))
  53. if m.Name == url || ms == url {
  54. menu = m
  55. break
  56. }
  57. }
  58. //只验证存在数据库中的规则
  59. if menu != nil {
  60. //若存在不需要验证的条件则跳过
  61. if gstr.Equal(menu.Condition, "nocheck") {
  62. r.Middleware.Next()
  63. return
  64. }
  65. menuId := menu.Id
  66. //菜单没存数据库不验证权限
  67. if menuId != 0 {
  68. //判断权限操作
  69. enforcer, err := casbin_adapter_service.GetEnforcer()
  70. if err != nil {
  71. g.Log().Error(err)
  72. response.FailJson(true, r, "获取权限失败")
  73. }
  74. groupPolicy := enforcer.GetFilteredGroupingPolicy(0,
  75. fmt.Sprintf("u_%d", adminId))
  76. if len(groupPolicy) == 0 {
  77. response.FailJson(true, r, "没有访问权限")
  78. }
  79. hasAccess := false
  80. for _, v := range groupPolicy {
  81. if enforcer.HasPolicy(v[1], fmt.Sprintf("r_%d", menuId), "All") {
  82. hasAccess = true
  83. break
  84. }
  85. }
  86. if !hasAccess {
  87. response.FailJson(true, r, "没有访问权限")
  88. }
  89. }
  90. } else if menu == nil && accessParamsStr != "" {
  91. response.FailJson(true, r, "没有访问权限")
  92. }
  93. r.Middleware.Next()
  94. }