jwt_black_list.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package system
  2. import (
  3. "context"
  4. "go.uber.org/zap"
  5. "server/global"
  6. "server/model/system"
  7. "server/utils"
  8. )
  9. type JwtService struct{}
  10. //@author: [piexlmax](https://github.com/piexlmax)
  11. //@function: JsonInBlacklist
  12. //@description: 拉黑jwt
  13. //@param: jwtList model.JwtBlacklist
  14. //@return: err error
  15. func (jwtService *JwtService) JsonInBlacklist(jwtList system.JwtBlacklist) (err error) {
  16. err = global.GVA_DB.Create(&jwtList).Error
  17. if err != nil {
  18. return
  19. }
  20. global.BlackCache.SetDefault(jwtList.Jwt, struct{}{})
  21. return
  22. }
  23. //@author: [piexlmax](https://github.com/piexlmax)
  24. //@function: IsBlacklist
  25. //@description: 判断JWT是否在黑名单内部
  26. //@param: jwt string
  27. //@return: bool
  28. func (jwtService *JwtService) IsBlacklist(jwt string) bool {
  29. _, ok := global.BlackCache.Get(jwt)
  30. return ok
  31. // err := global.GVA_DB.Where("jwt = ?", jwt).First(&system.JwtBlacklist{}).Error
  32. // isNotFound := errors.Is(err, gorm.ErrRecordNotFound)
  33. // return !isNotFound
  34. }
  35. //@author: [piexlmax](https://github.com/piexlmax)
  36. //@function: GetRedisJWT
  37. //@description: 从redis取jwt
  38. //@param: userName string
  39. //@return: redisJWT string, err error
  40. func (jwtService *JwtService) GetRedisJWT(userName string) (redisJWT string, err error) {
  41. redisJWT, err = global.GVA_REDIS.Get(context.Background(), userName).Result()
  42. return redisJWT, err
  43. }
  44. //@author: [piexlmax](https://github.com/piexlmax)
  45. //@function: SetRedisJWT
  46. //@description: jwt存入redis并设置过期时间
  47. //@param: jwt string, userName string
  48. //@return: err error
  49. func (jwtService *JwtService) SetRedisJWT(jwt string, userName string) (err error) {
  50. // 此处过期时间等于jwt过期时间
  51. dr, err := utils.ParseDuration(global.GVA_CONFIG.JWT.ExpiresTime)
  52. if err != nil {
  53. return err
  54. }
  55. timer := dr
  56. err = global.GVA_REDIS.Set(context.Background(), userName, jwt, timer).Err()
  57. return err
  58. }
  59. func LoadAll() {
  60. var data []string
  61. err := global.GVA_DB.Model(&system.JwtBlacklist{}).Select("jwt").Find(&data).Error
  62. if err != nil {
  63. global.GVA_LOG.Error("加载数据库jwt黑名单失败!", zap.Error(err))
  64. return
  65. }
  66. for i := 0; i < len(data); i++ {
  67. global.BlackCache.SetDefault(data[i], struct{}{})
  68. } // jwt黑名单 加入 BlackCache 中
  69. }