middleware.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. )
  14. //跨域处理中间件
  15. func CORS(r *ghttp.Request) {
  16. r.Response.CORSDefault()
  17. r.Middleware.Next()
  18. }
  19. //权限判断处理中间件
  20. func Auth(r *ghttp.Request) {
  21. if r.Method != "GET" {
  22. response.FailJson(true, r, "演示系统禁止操作")
  23. }
  24. //获取登陆用户id
  25. adminId := user_service.GetLoginID(r)
  26. //获取无需验证权限的用户id
  27. for _, v := range service.NotCheckAuthAdminIds {
  28. if v == adminId {
  29. r.Middleware.Next()
  30. return
  31. }
  32. }
  33. url := gstr.TrimLeft(r.Request.URL.Path, "/")
  34. //获取地址对应的菜单id
  35. menuList, err := auth_service.GetMenuIsStatusList()
  36. if err != nil {
  37. g.Log().Error(err)
  38. response.FailJson(true, r, "请求数据失败")
  39. }
  40. var menu *auth_rule.Entity
  41. for _, m := range menuList {
  42. if gstr.Equal(m.Name, url) {
  43. menu = m
  44. break
  45. }
  46. }
  47. //只验证存在数据库中的规则
  48. if menu != nil {
  49. //若存在不需要验证的条件则跳过
  50. if gstr.Equal(menu.Condition, "nocheck") {
  51. r.Middleware.Next()
  52. return
  53. }
  54. menuId := menu.Id
  55. //菜单没存数据库不验证权限
  56. if menuId != 0 {
  57. //判断权限操作
  58. enforcer, err := casbin_adapter_service.GetEnforcer()
  59. if err != nil {
  60. g.Log().Error(err)
  61. response.FailJson(true, r, "获取权限失败")
  62. }
  63. groupPolicy := enforcer.GetFilteredGroupingPolicy(0,
  64. fmt.Sprintf("u_%d", adminId))
  65. if len(groupPolicy) == 0 {
  66. response.FailJson(true, r, "没有访问权限")
  67. }
  68. hasAccess := false
  69. for _, v := range groupPolicy {
  70. if enforcer.HasPolicy(v[1], fmt.Sprintf("r_%d", menuId), "All") {
  71. hasAccess = true
  72. break
  73. }
  74. }
  75. if !hasAccess {
  76. response.FailJson(true, r, "没有访问权限")
  77. }
  78. }
  79. }
  80. r.Middleware.Next()
  81. }