permission.go 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package utils
  2. import (
  3. "errors"
  4. "spaceofcheng/services/models/model"
  5. "strings"
  6. )
  7. // 系统内置数据种类
  8. const (
  9. DATATYPE_USER = "user"
  10. DATATYPE_CASE = "case"
  11. DATATYPE_COURSE = "course"
  12. DATATYPE_COUPON = "coupon"
  13. DATATYPE_CARD = "card"
  14. )
  15. // DataAuthEngine 鉴权数据
  16. type DataAuthEngine struct {
  17. ctx *Context
  18. }
  19. // NewAuthEngine 生成新实例
  20. func NewAuthEngine(ctx *Context) *DataAuthEngine {
  21. return &DataAuthEngine{ctx: ctx}
  22. }
  23. // CheckCase 校验案场数据权限
  24. func (t *DataAuthEngine) CheckCase(caseID string) error {
  25. cases := t.ctx.Get("cases")
  26. if cases == nil {
  27. return errors.New("请授权用户案场权限")
  28. }
  29. found := false
  30. userCases := cases.([]model.SysUserCase)
  31. for _, cs := range userCases {
  32. if caseID == cs.CaseId {
  33. found = true
  34. }
  35. }
  36. if !found {
  37. return errors.New("用户无该案场数据权限")
  38. }
  39. return nil
  40. }
  41. // AuthFilter 按权限过滤
  42. func (t *DataAuthEngine) AuthFilter(targ interface{}, sql string, params ...interface{}) error {
  43. if t.ctx == nil {
  44. return errors.New("未指定上下文环境")
  45. }
  46. // 用户所属案场
  47. casesRaw := t.ctx.Get("cases")
  48. if casesRaw == nil {
  49. return errors.New("用户无权限操作该数据")
  50. }
  51. cases := casesRaw.([]model.SysUserCase)
  52. csIDs := make([]string, 0)
  53. for _, cs := range cases {
  54. csIDs = append(csIDs, cs.CaseId)
  55. }
  56. newSQL := "select * from (" + sql + ") where case_id in ('" + strings.Join(csIDs, "','") + "')"
  57. if err := t.ctx.DB.SQL(newSQL, params...).Find(targ); err != nil {
  58. LogError("按权限查询数据失败: " + err.Error())
  59. return errors.New("数据查询失败")
  60. }
  61. return nil
  62. }
  63. // HasUserPermission 是否有人员权限
  64. func (t *DataAuthEngine) HasUserPermission(userID, borrower string, caseID ...string) error {
  65. // 1、先判断组织是否相同
  66. userOrg, err := t.getOrgOfData(userID, DATATYPE_USER)
  67. if err != nil {
  68. LogError("查询用户(" + userID + ") 所属组织失败: " + err.Error())
  69. return errors.New("查询用户相关信息失败")
  70. }
  71. borwOrg, err := t.getOrgOfData(borrower, DATATYPE_USER)
  72. if err != nil {
  73. LogError("查询用户(" + borrower + ") 所属组织失败: " + err.Error())
  74. return errors.New("查询用户相关信息失败")
  75. }
  76. if userOrg != borwOrg {
  77. return errors.New("人员不存在或无权浏览")
  78. }
  79. // 2、再判断是否案场相同
  80. sameCases, err := t.getSameCase(userID, borrower)
  81. if err != nil {
  82. return errors.New("用户没有相同案场授权")
  83. }
  84. // 3、是否指定了案场
  85. if len(caseID) > 0 {
  86. if StrSliceIndexOf(sameCases, caseID[0]) < 0 {
  87. return errors.New("用户没有当前案场权限")
  88. }
  89. }
  90. return nil
  91. }
  92. func (t *DataAuthEngine) getOrgOfData(dataID, dataType string) (string, error) {
  93. org := make(map[string]interface{})
  94. switch dataType {
  95. // 用户
  96. case DATATYPE_USER:
  97. if _, err := t.ctx.DB.SQL("select org_id from sys_user where user_id = ?", dataID).Get(&org); err != nil {
  98. return "", err
  99. }
  100. orgID := org["org_id"].(string)
  101. return orgID, nil
  102. // 案场
  103. case DATATYPE_CASE:
  104. if _, err := t.ctx.DB.SQL("select org_id from sys_case where case_id = ?", dataID).Get(&org); err != nil {
  105. return "", err
  106. }
  107. orgID := org["org_id"].(string)
  108. return orgID, nil
  109. default:
  110. return "", nil
  111. }
  112. }
  113. func (t *DataAuthEngine) getSameCase(user1, user2 string) ([]string, error) {
  114. sql := `
  115. SELECT t.case_id
  116. FROM
  117. sys_user_case t
  118. JOIN sys_user_case s ON t.user_id = ?
  119. AND s.user_id = ?
  120. AND t.case_id = s.case_id
  121. `
  122. res, err := t.ctx.DB.Query(sql, user1, user2)
  123. if err != nil {
  124. LogError("查询用户相同案场失败: " + err.Error())
  125. return nil, err
  126. }
  127. if res == nil || len(res) == 0 {
  128. return nil, errors.New("用户没有相同案场授权")
  129. }
  130. csIDs := make([]string, 0)
  131. for _, cs := range res {
  132. csIDs = append(csIDs, string(cs["case_id"]))
  133. }
  134. return csIDs, nil
  135. }