@@ -45,6 +45,82 @@ func cacheToken(port uint16, domain, token string, secretLevel int, username str
45
45
_ , err = conn .Do ("EXPIRE" , fmt .Sprintf (RedisKeyUsernameToTokens , port , domain , username ), cacheTime )
46
46
}
47
47
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
+
48
124
func getTokenSecretLevel (port uint16 , domain , token string ) (secretLevel int , username string ) {
49
125
var err error
50
126
conn := cache .Get ()
0 commit comments