auth.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package middleware
  2. import (
  3. comService "gfast/app/common/service"
  4. "gfast/app/system/api"
  5. "gfast/app/system/dao"
  6. "gfast/app/system/model"
  7. "gfast/app/system/service"
  8. "gfast/library"
  9. "github.com/gogf/gf/frame/g"
  10. "github.com/gogf/gf/net/ghttp"
  11. "github.com/gogf/gf/text/gstr"
  12. "github.com/gogf/gf/util/gconv"
  13. )
  14. // Ctx 自定义上下文对象
  15. func Ctx(r *ghttp.Request) {
  16. // 初始化,务必最开始执行
  17. customCtx := &dao.Context{
  18. Session: r.Session,
  19. Data: make(g.Map),
  20. }
  21. service.Context.Init(r, customCtx)
  22. user := new(model.LoginUserRes)
  23. resp := api.GfToken.GetTokenData(r)
  24. err := gconv.Struct(resp.Get("data"), &user)
  25. if err != nil {
  26. g.Log().Error(err.Error())
  27. }
  28. if user != nil {
  29. customCtx.User = &dao.CtxUser{
  30. Id: user.Id,
  31. UserName: user.UserName,
  32. UserNickname: user.UserNickname,
  33. DeptId: user.DeptId,
  34. UserStatus: user.UserStatus,
  35. IsAdmin: user.IsAdmin,
  36. Avatar: user.Avatar,
  37. }
  38. }
  39. // 将自定义的上下文对象传递到模板变量中使用
  40. r.Assigns(g.Map{
  41. "Context": customCtx,
  42. })
  43. // 执行下一步请求逻辑
  44. r.Middleware.Next()
  45. }
  46. // Auth 权限判断处理中间件
  47. func Auth(r *ghttp.Request) {
  48. userInfo := service.Context.Get(r.GetCtx()).User
  49. //获取登陆用户id
  50. adminId := userInfo.Id
  51. /*if r.Method != "GET" && adminId!=1{
  52. library.FailJson(true, r, "演示系统禁止操作")
  53. }*/
  54. accessParams := r.GetStrings("accessParams")
  55. accessParamsStr := ""
  56. if len(accessParams) > 0 && accessParams[0] != "undefined" {
  57. accessParamsStr = "?" + gstr.Join(accessParams, "&")
  58. }
  59. //获取无需验证权限的用户id
  60. tagSuperAdmin := false
  61. service.SysUser.NotCheckAuthAdminIds.Iterator(func(v interface{}) bool {
  62. if gconv.Uint64(v) == adminId {
  63. tagSuperAdmin = true
  64. return false
  65. }
  66. return true
  67. })
  68. if tagSuperAdmin {
  69. r.Middleware.Next()
  70. //不要再往后面执行
  71. return
  72. }
  73. url := gstr.TrimLeft(r.Request.URL.Path, "/") + accessParamsStr
  74. //获取地址对应的菜单id
  75. menuList, err := service.Rule.GetMenuIsStatusList()
  76. if err != nil {
  77. g.Log().Error(err)
  78. library.FailJson(true, r, "请求数据失败")
  79. }
  80. var menu *model.SysAuthRuleInfoRes
  81. for _, m := range menuList {
  82. ms := gstr.SubStr(m.Name, 0, gstr.Pos(m.Name, "?"))
  83. if m.Name == url || ms == url {
  84. menu = m
  85. break
  86. }
  87. }
  88. //只验证存在数据库中的规则
  89. if menu != nil {
  90. //若存在不需要验证的条件则跳过
  91. if gstr.Equal(menu.Condition, "nocheck") {
  92. r.Middleware.Next()
  93. return
  94. }
  95. menuId := menu.Id
  96. //菜单没存数据库不验证权限
  97. if menuId != 0 {
  98. //判断权限操作
  99. enforcer, err := comService.Casbin.GetEnforcer()
  100. if err != nil {
  101. g.Log().Error(err)
  102. library.FailJson(true, r, "获取权限失败")
  103. }
  104. groupPolicy := enforcer.GetFilteredGroupingPolicy(0,
  105. gconv.String(adminId))
  106. if len(groupPolicy) == 0 {
  107. library.FailJson(true, r, "没有访问权限")
  108. }
  109. hasAccess := false
  110. for _, v := range groupPolicy {
  111. if enforcer.HasPolicy(v[1], gconv.String(menuId), "All") {
  112. hasAccess = true
  113. break
  114. }
  115. }
  116. if !hasAccess {
  117. library.FailJson(true, r, "没有访问权限")
  118. }
  119. }
  120. } else if menu == nil && accessParamsStr != "" {
  121. library.FailJson(true, r, "没有访问权限")
  122. }
  123. r.Middleware.Next()
  124. }