auth.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package middlewares
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "sync"
  7. "xugu_license/internal/global"
  8. "xugu_license/internal/models"
  9. "github.com/gin-gonic/gin"
  10. )
  11. var Roles = map[string]Role{
  12. "admin": AdminRole,
  13. "supportRole": SupportRole,
  14. "guest": GuestRole,
  15. }
  16. type UserPermission struct {
  17. UserInfo models.UserInfo
  18. Role Role
  19. }
  20. // 定义权限类型
  21. type Permission string
  22. const (
  23. // License 相关权限
  24. GenerateLicense Permission = "generate_license" //生成license
  25. UploadLicense Permission = "upload_license" //上传license
  26. ReadLicense Permission = "read_license" //读取license
  27. ReadAllLicense Permission = "read_all_license" //读取所有license
  28. ReadlicenseRecord Permission = "read_license_record" //读取license
  29. UpdateLicense Permission = "update_license" //更新license
  30. DeleteLicense Permission = "delete_license" //删除license
  31. // 消息分发权限
  32. DispatLicense Permission = "dispat_license" //分发license
  33. // 获得用户信息
  34. //GetUserInfo1 Permission = "get_user_info" //获得用户信息
  35. // 用户管理权限
  36. CreateUser Permission = "create_user" //创建用户
  37. ReadUser Permission = "read_user" //读取用户
  38. UpdateUser Permission = "update_user" //更新用户
  39. DeleteUser Permission = "delete_user" //删除用户
  40. //角色管理权限
  41. CreateRole Permission = "create_role" //创建角色
  42. DeleteRole Permission = "delete_role" //删除角色
  43. UpdateRole Permission = "update_role" //更新角色
  44. GetRole Permission = "get_role" //获得角色
  45. )
  46. // 定义映射
  47. var permissionMap = map[string]Permission{
  48. "generate_license": GenerateLicense,
  49. "upload_license": UploadLicense,
  50. "read_license": ReadLicense,
  51. "read_all_license": ReadAllLicense,
  52. "read_license_record": ReadlicenseRecord,
  53. "update_license": UpdateLicense,
  54. "delete_license": DeleteLicense,
  55. "dispat_license": DispatLicense,
  56. //"get_user_info": GetUserInfo1,
  57. "create_user": CreateUser,
  58. "read_user": ReadUser,
  59. "update_user": UpdateUser,
  60. "delete_user": DeleteUser,
  61. "create_role": CreateRole,
  62. "delete_role": DeleteRole,
  63. "update_role": UpdateRole,
  64. "get_role": GetRole,
  65. }
  66. // MapBasedStringToPermission 使用 map 进行字符串到 Permission 的转换
  67. func MapBasedStringToPermission(permissionStr string) (Permission, error) {
  68. fmt.Println("permissionStr: ", permissionStr)
  69. if perm, exists := permissionMap[permissionStr]; exists {
  70. return perm, nil
  71. }
  72. return "", errors.New("invalid permission string")
  73. }
  74. // StringsToPermissions 将字符串数组转换为 Permission 数组
  75. func StringsToPermissions(permissionStrs []string) ([]Permission, error) {
  76. var permissions []Permission
  77. fmt.Println("permissionStrs: ", permissionStrs)
  78. for _, str := range permissionStrs {
  79. perm, err := MapBasedStringToPermission(str)
  80. if err != nil {
  81. return nil, err // 如果有任何一个字符串无效,返回错误
  82. }
  83. permissions = append(permissions, perm)
  84. }
  85. return permissions, nil
  86. }
  87. type Role struct {
  88. Id int
  89. Name string
  90. Permissions []Permission
  91. }
  92. var AdminRole = Role{
  93. Id: 0,
  94. Name: "admin",
  95. Permissions: []Permission{
  96. GenerateLicense,
  97. UploadLicense,
  98. ReadLicense,
  99. ReadAllLicense,
  100. UpdateLicense,
  101. DeleteLicense,
  102. DispatLicense,
  103. //GetUserInfo1,
  104. ReadlicenseRecord,
  105. CreateUser,
  106. ReadUser,
  107. UpdateUser,
  108. DeleteUser,
  109. CreateRole,
  110. DeleteRole,
  111. UpdateRole,
  112. GetRole,
  113. },
  114. }
  115. var SupportRole = Role{
  116. Id: 0,
  117. Name: "support",
  118. Permissions: []Permission{
  119. ReadLicense,
  120. DispatLicense,
  121. ReadLicense,
  122. //GetUserInfo1,
  123. ReadlicenseRecord,
  124. ReadUser,
  125. UploadLicense,
  126. },
  127. }
  128. var GuestRole = Role{
  129. Id: 0,
  130. Name: "guest",
  131. Permissions: []Permission{
  132. ReadLicense,
  133. },
  134. }
  135. // RBAC 中间件
  136. func PermissionMiddleware(requiredPermission Permission) gin.HandlerFunc {
  137. return func(c *gin.Context) {
  138. userAny, exists := c.Get("userInfo")
  139. if !exists {
  140. c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"})
  141. c.Abort()
  142. return
  143. }
  144. userInfo := userAny.(*UserAuthInfo)
  145. uP := UserPermission{
  146. //UserInfo: *userInfo,
  147. Role: Role{
  148. Name: userInfo.Role,
  149. },
  150. }
  151. // switch userInfo.Role {
  152. // case "admin":
  153. // uP.Role = AdminRole
  154. // case "support":
  155. // uP.Role = SupportRole
  156. // case "guest":
  157. // uP.Role = GuestRole
  158. // default:
  159. // c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role"})
  160. // c.Abort()
  161. // return
  162. // }
  163. // 检查用户是否具有所需的权限
  164. roleKey := userInfo.Role
  165. if role, exists := Roles[roleKey]; exists {
  166. // 如果存在,可以在这里使用 role 进行后续操作
  167. uP.Role = role
  168. } else {
  169. // 如果不存在,进行相应的处理
  170. global.Logger.Errorln("Role does not exist ")
  171. c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role"})
  172. c.Abort()
  173. return
  174. }
  175. hasPermission := false
  176. for _, p := range uP.Role.Permissions {
  177. if p == requiredPermission {
  178. hasPermission = true
  179. break
  180. }
  181. }
  182. if !hasPermission {
  183. global.Logger.Errorln("没有权限 ")
  184. c.JSON(http.StatusForbidden, gin.H{"error": "没有权限"})
  185. c.Abort()
  186. return
  187. }
  188. c.Next()
  189. }
  190. }
  191. var mu sync.Mutex
  192. // 权限分配功能
  193. // func AssignRole(c *gin.Context) {
  194. // var req struct {
  195. // Username string `json:"username" binding:"required"`
  196. // Role string `json:"role" binding:"required"`
  197. // }
  198. // if err := c.ShouldBindJSON(&req); err != nil {
  199. // c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  200. // return
  201. // }
  202. // mu.Lock()
  203. // defer mu.Unlock()
  204. // //从数据库里查询用户
  205. // user, exists := users[req.Username]
  206. // if exists {
  207. // switch req.Role {
  208. // case "admin":
  209. // user.Role = AdminRole
  210. // case "user":
  211. // user.Role = UserRole
  212. // case "guest":
  213. // user.Role = GuestRole
  214. // default:
  215. // c.JSON(http.StatusBadRequest, gin.H{"error": "invalid role"})
  216. // return
  217. // }
  218. // users[req.Username] = user
  219. // } else {
  220. // c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
  221. // return
  222. // }
  223. // c.JSON(http.StatusOK, gin.H{"message": "Role assigned successfully"})
  224. // }