Ver código fonte

修复 v8下redis 验证码模式 存在的未传入context的bug

蒋吉兆 3 anos atrás
pai
commit
2342a47c62
2 arquivos alterados com 14 adições e 7 exclusões
  1. 2 1
      server/api/v1/system/sys_captcha.go
  2. 12 6
      server/utils/captcha/redis.go

+ 2 - 1
server/api/v1/system/sys_captcha.go

@@ -10,7 +10,7 @@ import (
 )
 
 // 当开启多服务器部署时,替换下面的配置,使用redis共享存储验证码
-// var store = captcha.NewDefaultRedisStore()
+//var store = captcha.NewDefaultRedisStore()
 var store = base64Captcha.DefaultMemStore
 
 type BaseApi struct {
@@ -27,6 +27,7 @@ func (b *BaseApi) Captcha(c *gin.Context) {
 	// 字符,公式,验证码配置
 	// 生成默认数字的driver
 	driver := base64Captcha.NewDriverDigit(global.GVA_CONFIG.Captcha.ImgHeight, global.GVA_CONFIG.Captcha.ImgWidth, global.GVA_CONFIG.Captcha.KeyLong, 0.7, 80)
+	//cp := base64Captcha.NewCaptcha(driver, store.UseWithCtx(c))   // v8下使用redis
 	cp := base64Captcha.NewCaptcha(driver, store)
 	if id, b64s, err := cp.Generate(); err != nil {
 		global.GVA_LOG.Error("验证码获取失败!", zap.Any("err", err))

+ 12 - 6
server/utils/captcha/redis.go

@@ -1,14 +1,14 @@
 package captcha
 
 import (
+	"context"
 	"gin-vue-admin/global"
-	"time"
-
 	"github.com/mojocn/base64Captcha"
 	"go.uber.org/zap"
+	"time"
 )
 
-func NewDefaultRedisStore() base64Captcha.Store {
+func NewDefaultRedisStore() *RedisStore {
 	return &RedisStore{
 		Expiration: time.Second * 180,
 		PreKey:     "CAPTCHA_",
@@ -18,23 +18,29 @@ func NewDefaultRedisStore() base64Captcha.Store {
 type RedisStore struct {
 	Expiration time.Duration
 	PreKey     string
+	Context    context.Context
+}
+
+func (rs *RedisStore) UseWithCtx(ctx context.Context) base64Captcha.Store {
+	rs.Context = ctx
+	return rs
 }
 
 func (rs *RedisStore) Set(id string, value string) {
-	err := global.GVA_REDIS.Set(rs.PreKey+id, value, rs.Expiration).Err()
+	err := global.GVA_REDIS.Set(rs.Context, rs.PreKey+id, value, rs.Expiration).Err()
 	if err != nil {
 		global.GVA_LOG.Error("RedisStoreSetError!", zap.Error(err))
 	}
 }
 
 func (rs *RedisStore) Get(key string, clear bool) string {
-	val, err := global.GVA_REDIS.Get(key).Result()
+	val, err := global.GVA_REDIS.Get(rs.Context, key).Result()
 	if err != nil {
 		global.GVA_LOG.Error("RedisStoreGetError!", zap.Error(err))
 		return ""
 	}
 	if clear {
-		err := global.GVA_REDIS.Del(key).Err()
+		err := global.GVA_REDIS.Del(rs.Context, key).Err()
 		if err != nil {
 			global.GVA_LOG.Error("RedisStoreClearError!", zap.Error(err))
 			return ""