auth.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package admin
  2. import (
  3. "errors"
  4. "fmt"
  5. "strings"
  6. "zhiyuan/models"
  7. "zhiyuan/pkg/app"
  8. "zhiyuan/pkg/db"
  9. "zhiyuan/pkg/redis"
  10. "zhiyuan/pkg/utils"
  11. "zhiyuan/services/dept"
  12. )
  13. const AUTH_CACHE_KEY = "auth_list_"
  14. const DATA_AUTH_CACHE_KEY = "data_auth_list_"
  15. var Role models.Role
  16. var Auth models.Auth
  17. func IsSuperAdmin(id int) bool {
  18. return id == 1
  19. }
  20. func CheckAuth(authArr []string, id int) bool {
  21. admin, _ := GetInfoByID(id, nil, nil)
  22. if admin == nil {
  23. return false
  24. }
  25. if IsSuperAdmin(admin.ID) {
  26. return true
  27. }
  28. authList, err := GetAuth(admin.ID)
  29. if err != nil || len(authList) == 0 {
  30. return false
  31. }
  32. for _, v := range authArr {
  33. if !utils.IsContain(authList, v) {
  34. return false
  35. }
  36. }
  37. return true
  38. }
  39. func GetAuth(id int) ([]string, error) {
  40. admin, _ := GetInfoByID(id, nil, nil)
  41. if admin == nil {
  42. return []string{}, errors.New("empty admin info")
  43. }
  44. cacheKey := AUTH_CACHE_KEY + utils.ToStr(admin.ID)
  45. authList, err := redis.SMembers(cacheKey)
  46. if admin.RefreshAuth == 1 || err != nil || authList == nil || len(authList) == 0 {
  47. authListTemp := UpdateAuth(admin)
  48. authList = make([]string, 0)
  49. for _, v := range authListTemp {
  50. authList = append(authList, fmt.Sprint(v))
  51. }
  52. db.Update(Admin.TableName(), map[string]interface{}{"id": admin.ID}, map[string]interface{}{"refresh_auth": 0})
  53. }
  54. return authList, nil
  55. }
  56. func GetDataAuth(id int) (int, error) {
  57. admin, _ := GetInfoByID(id, nil, nil)
  58. if admin == nil {
  59. return 1, errors.New("empty admin info")
  60. }
  61. if IsSuperAdmin(admin.ID) {
  62. return 99, nil
  63. }
  64. cacheKey := DATA_AUTH_CACHE_KEY + utils.ToStr(admin.ID)
  65. roleSlice := strings.Split(admin.RoleIds, ",")
  66. res, err := redis.Get(cacheKey)
  67. dataAuth := utils.ToInt(res)
  68. if admin.RefreshDataAuth == 1 || err != nil {
  69. dataAuth = 1
  70. if len(roleSlice) > 0 {
  71. roleTemp, err := Role.GetOne(map[string]interface{}{"id in": roleSlice, "_orderby": "data_auth desc"}, []string{"data_auth"}, nil)
  72. if err != nil {
  73. return 1, err
  74. }
  75. dataAuth = utils.ToInt(roleTemp.DataAuth)
  76. db.Update(Admin.TableName(), map[string]interface{}{"id": admin.ID}, map[string]interface{}{"refresh_data_auth": 0})
  77. }
  78. redis.Set(cacheKey, dataAuth, 3600)
  79. }
  80. return dataAuth, nil
  81. }
  82. func GetAdminByDataAuth(adminId int) ([]int, error) {
  83. admin, err := GetInfoByID(adminId, nil, nil)
  84. if err != nil {
  85. return nil, err
  86. }
  87. dataAuth, err := GetDataAuth(admin.ID)
  88. if err != nil {
  89. return nil, err
  90. }
  91. if dataAuth == 1 {
  92. return []int{admin.ID}, nil
  93. } else if dataAuth == 99 {
  94. return []int{-1}, nil
  95. }
  96. if admin.DeptID <= 0 {
  97. return nil, nil
  98. }
  99. deptIds := make([]int, 0)
  100. adminIds := make([]int, 0)
  101. if dataAuth == 2 {
  102. deptIds = append(deptIds, admin.DeptID)
  103. } else if dataAuth == 3 {
  104. deptIds = dept.GetSubDeptIds(admin.DeptID, []int{admin.DeptID})
  105. }
  106. adminList, err := GetAdmins(map[string]interface{}{"dept_id in": deptIds}, []string{"id", "dept_id"}, app.Page{}, nil)
  107. if err != nil {
  108. return nil, err
  109. }
  110. for _, adminItem := range adminList {
  111. adminIds = append(adminIds, adminItem.ID)
  112. }
  113. return adminIds, nil
  114. }
  115. func UpdateAuth(admin *models.Admin) []interface{} {
  116. authList := make([]interface{}, 0)
  117. if IsSuperAdmin(admin.ID) {
  118. authListTemp, _ := Auth.GetMulti(nil, []string{"auth"}, nil)
  119. for _, v := range authListTemp {
  120. authList = append(authList, v.Auth)
  121. }
  122. } else {
  123. roleSlice := strings.Split(admin.RoleIds, ",")
  124. roleListTemp, _ := Role.GetMulti(map[string]interface{}{"id in": roleSlice}, []string{"auth_list"}, nil)
  125. for _, v := range roleListTemp {
  126. authListSlice := strings.Split(v.AuthList, ",")
  127. for _, vv := range authListSlice {
  128. authList = utils.AppendUniqueInterface(authList, vv)
  129. }
  130. }
  131. }
  132. cacheKey := AUTH_CACHE_KEY + utils.ToStr(admin.ID)
  133. if len(authList) == 0 {
  134. authList = append(authList, "empty")
  135. }
  136. redis.SAdd(cacheKey, authList, -1)
  137. return authList
  138. }
  139. func ClearAuthCacheByRole(id int) {
  140. if adminList, err := GetAdminsRaw(map[string]string{"where": "find_in_set({{role_id}}, role_ids)"}, map[string]interface{}{"role_id": id}, nil); err == nil {
  141. for _, v := range adminList {
  142. redis.Del(AUTH_CACHE_KEY + utils.ToStr(v.ID))
  143. redis.Del(DATA_AUTH_CACHE_KEY + utils.ToStr(v.ID))
  144. }
  145. }
  146. }
  147. func ClearAuthCacheByAdmin(id int) {
  148. redis.Del(AUTH_CACHE_KEY + utils.ToStr(id))
  149. redis.Del(DATA_AUTH_CACHE_KEY + utils.ToStr(id))
  150. }
  151. func ClearAuthAll() {
  152. db.Update(Admin.TableName(), map[string]interface{}{"id >": 0}, map[string]interface{}{"refresh_auth": 1, "refresh_data_auth": 1})
  153. }