Skip to content

Commit e2268cb

Browse files
committed
feat: 增加清理缓存redis的set中用户token的方法
1 parent 2da8051 commit e2268cb

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

internal/proxy/cacheToken.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,82 @@ func cacheToken(port uint16, domain, token string, secretLevel int, username str
4545
_, err = conn.Do("EXPIRE", fmt.Sprintf(RedisKeyUsernameToTokens, port, domain, username), cacheTime)
4646
}
4747

48+
// cleanUserTokenInCacheSet 清理RedisKeyUsernameToTokens中的无效token
49+
func cleanUserTokenInCacheSet() {
50+
keys := getUsernameTokenSetKeys()
51+
// 清理无效token
52+
for _, key := range keys {
53+
// 从key中提取port和domain
54+
var port uint16
55+
var domain string
56+
var username string
57+
_, err := fmt.Sscanf(key, fmt.Sprintf(RedisKeyUsernameToTokens, "%d", "%s", "%s"), &port, &domain, &username)
58+
if err != nil {
59+
logger.Error(err)
60+
continue
61+
}
62+
63+
checkAndClearTokensInCacheSet(port, domain, username)
64+
}
65+
}
66+
67+
func getUsernameTokenSetKeys() (keys []string) {
68+
conn := cache.Get()
69+
defer func(conn redis.Conn) {
70+
err := conn.Close()
71+
if err != nil {
72+
logger.Error(err)
73+
}
74+
}(conn)
75+
76+
var err error
77+
78+
// 搜索所有带username的key (RedisKeyUsernameToTokens)
79+
keys, err = redis.Strings(conn.Do("KEYS", fmt.Sprintf(RedisKeyUsernameToTokens, "*", "*", "*")))
80+
if err != nil {
81+
logger.Error(err)
82+
}
83+
return
84+
}
85+
86+
func checkAndClearTokensInCacheSet(port uint16, domain, username string) {
87+
conn := cache.Get()
88+
defer func(conn redis.Conn) {
89+
err := conn.Close()
90+
if err != nil {
91+
logger.Error(err)
92+
}
93+
}(conn)
94+
95+
key := fmt.Sprintf(RedisKeyUsernameToTokens, port, domain, username)
96+
97+
if port == 0 || domain == "" || username == "" {
98+
logger.Error("port or domain or username is empty")
99+
// 删除无效key
100+
_, _ = conn.Do("DEL", key)
101+
return
102+
}
103+
104+
// 取出所有token
105+
tokens, err := redis.Strings(conn.Do("SMEMBERS", key))
106+
if err != nil {
107+
logger.Error(err)
108+
return
109+
}
110+
111+
// 删除token和密级关系
112+
for _, token := range tokens {
113+
// 检查是否存在token和密级关系
114+
_, err = redis.Int(conn.Do("GET", fmt.Sprintf(RedisKeyTokenToSecretLevel, port, domain, token)))
115+
if err != nil && errors.Is(err, redis.ErrNil) {
116+
// 不存在则删除RedisKeyUsernameToTokens中的token
117+
_, _ = conn.Do("SREM", fmt.Sprintf(RedisKeyUsernameToTokens, port, domain, username), token)
118+
continue
119+
}
120+
}
121+
122+
}
123+
48124
func getTokenSecretLevel(port uint16, domain, token string) (secretLevel int, username string) {
49125
var err error
50126
conn := cache.Get()

0 commit comments

Comments
 (0)