세션 삭제용 구조체 선언
This commit is contained in:
@ -57,8 +57,9 @@ type Provider interface {
|
||||
}
|
||||
|
||||
type InvalidatedSession struct {
|
||||
Account primitive.ObjectID
|
||||
Infinite bool
|
||||
Account primitive.ObjectID
|
||||
SessionKeys []string
|
||||
Infinite bool
|
||||
}
|
||||
|
||||
type Consumer interface {
|
||||
|
||||
@ -2,6 +2,7 @@ package session
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"slices"
|
||||
@ -78,12 +79,17 @@ func (p *provider_redis) RevokeAll(account primitive.ObjectID, infinite bool) ([
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, sk := range sks {
|
||||
if infinite {
|
||||
p.redisClient.Publish(p.ctx, p.deleteChannel, "~"+sk).Result()
|
||||
} else {
|
||||
p.redisClient.Publish(p.ctx, p.deleteChannel, sk).Result()
|
||||
if len(sks) > 0 {
|
||||
p.redisClient.Del(p.ctx, sks...)
|
||||
|
||||
invsess := InvalidatedSession{
|
||||
SessionKeys: sks,
|
||||
Account: account,
|
||||
Infinite: infinite,
|
||||
}
|
||||
data, _ := json.Marshal(invsess)
|
||||
|
||||
p.redisClient.Publish(p.ctx, p.deleteChannel, string(data)).Result()
|
||||
}
|
||||
|
||||
return sks, nil
|
||||
@ -172,25 +178,18 @@ func newConsumerWithRedis(ctx context.Context, redisUrl string, ttl time.Duratio
|
||||
|
||||
switch msg.Channel {
|
||||
case deleteChannel:
|
||||
infinite := false
|
||||
var sk string
|
||||
if msg.Payload[0] == '~' {
|
||||
sk = msg.Payload[1:]
|
||||
infinite = true
|
||||
} else {
|
||||
sk = msg.Payload
|
||||
infinite = false
|
||||
var invsess InvalidatedSession
|
||||
if err := json.Unmarshal([]byte(msg.Payload), &invsess); err != nil {
|
||||
logger.Println("redis consumer deleteChannel unmarshal failed :", err)
|
||||
break
|
||||
}
|
||||
old := consumer.delete(storagekey(sk))
|
||||
if old != nil {
|
||||
invsess := InvalidatedSession{
|
||||
Account: old.Account,
|
||||
Infinite: infinite,
|
||||
}
|
||||
|
||||
for _, f := range consumer.onSessionInvalidated {
|
||||
f(invsess)
|
||||
}
|
||||
for _, sk := range invsess.SessionKeys {
|
||||
consumer.delete(storagekey(sk))
|
||||
}
|
||||
|
||||
for _, f := range consumer.onSessionInvalidated {
|
||||
f(invsess)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user