auth.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package middleware
  2. import (
  3. "gin-template/common"
  4. "gin-template/model"
  5. "github.com/gin-contrib/sessions"
  6. "github.com/gin-gonic/gin"
  7. "net/http"
  8. )
  9. func authHelper(c *gin.Context, minRole int) {
  10. session := sessions.Default(c)
  11. username := session.Get("username")
  12. role := session.Get("role")
  13. id := session.Get("id")
  14. status := session.Get("status")
  15. authByToken := false
  16. if username == nil {
  17. // Check token
  18. token := c.Request.Header.Get("Authorization")
  19. if token == "" {
  20. c.JSON(http.StatusOK, gin.H{
  21. "success": false,
  22. "message": "无权进行此操作,未登录或 token 无效",
  23. })
  24. c.Abort()
  25. return
  26. }
  27. user := model.ValidateUserToken(token)
  28. if user != nil && user.Username != "" {
  29. // Token is valid
  30. username = user.Username
  31. role = user.Role
  32. id = user.Id
  33. status = user.Status
  34. } else {
  35. c.JSON(http.StatusOK, gin.H{
  36. "success": false,
  37. "message": "无权进行此操作,token 无效",
  38. })
  39. c.Abort()
  40. return
  41. }
  42. authByToken = true
  43. }
  44. if status.(int) == common.UserStatusDisabled {
  45. c.JSON(http.StatusOK, gin.H{
  46. "success": false,
  47. "message": "用户已被封禁",
  48. })
  49. c.Abort()
  50. return
  51. }
  52. if role.(int) < minRole {
  53. c.JSON(http.StatusOK, gin.H{
  54. "success": false,
  55. "message": "无权进行此操作,权限不足",
  56. })
  57. c.Abort()
  58. return
  59. }
  60. c.Set("username", username)
  61. c.Set("role", role)
  62. c.Set("id", id)
  63. c.Set("authByToken", authByToken)
  64. c.Next()
  65. }
  66. func UserAuth() func(c *gin.Context) {
  67. return func(c *gin.Context) {
  68. authHelper(c, common.RoleCommonUser)
  69. }
  70. }
  71. func AdminAuth() func(c *gin.Context) {
  72. return func(c *gin.Context) {
  73. authHelper(c, common.RoleAdminUser)
  74. }
  75. }
  76. func RootAuth() func(c *gin.Context) {
  77. return func(c *gin.Context) {
  78. authHelper(c, common.RoleRootUser)
  79. }
  80. }
  81. // NoTokenAuth You should always use this after normal auth middlewares.
  82. func NoTokenAuth() func(c *gin.Context) {
  83. return func(c *gin.Context) {
  84. authByToken := c.GetBool("authByToken")
  85. if authByToken {
  86. c.JSON(http.StatusOK, gin.H{
  87. "success": false,
  88. "message": "本接口不支持使用 token 进行验证",
  89. })
  90. c.Abort()
  91. return
  92. }
  93. c.Next()
  94. }
  95. }
  96. // TokenOnlyAuth You should always use this after normal auth middlewares.
  97. func TokenOnlyAuth() func(c *gin.Context) {
  98. return func(c *gin.Context) {
  99. authByToken := c.GetBool("authByToken")
  100. if !authByToken {
  101. c.JSON(http.StatusOK, gin.H{
  102. "success": false,
  103. "message": "本接口仅支持使用 token 进行验证",
  104. })
  105. c.Abort()
  106. return
  107. }
  108. c.Next()
  109. }
  110. }