세션 invalidate될 때 전달하는 인자를 구조체로 변경
This commit is contained in:
@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"slices"
|
||||
"time"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
@ -43,31 +44,18 @@ func newProviderWithRedis(ctx context.Context, redisUrl string, ttl time.Duratio
|
||||
}
|
||||
|
||||
func (p *provider_redis) New(input *Authorization) (string, error) {
|
||||
newsk := make_storagekey(input.Account)
|
||||
prefix := input.Account.Hex()
|
||||
sks, err := p.redisClient.Keys(p.ctx, prefix+"*").Result()
|
||||
sks, err := p.RevokeAll(input.Account, false)
|
||||
if err != nil {
|
||||
logger.Println("session provider delete :", sks, err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
p.redisClient.Del(p.ctx, sks...)
|
||||
for _, sk := range sks {
|
||||
p.redisClient.Publish(p.ctx, p.deleteChannel, sk).Result()
|
||||
}
|
||||
|
||||
var newsk storagekey
|
||||
for {
|
||||
duplicated := false
|
||||
for _, sk := range sks {
|
||||
if sk == string(newsk) {
|
||||
duplicated = true
|
||||
break
|
||||
}
|
||||
}
|
||||
newsk = make_storagekey(input.Account)
|
||||
duplicated := slices.Contains(sks, string(newsk))
|
||||
if !duplicated {
|
||||
break
|
||||
}
|
||||
newsk = make_storagekey(input.Account)
|
||||
}
|
||||
|
||||
_, err = p.redisClient.HSet(p.ctx, string(newsk), input.ToStrings()).Result()
|
||||
@ -82,20 +70,23 @@ func (p *provider_redis) New(input *Authorization) (string, error) {
|
||||
return string(pk), err
|
||||
}
|
||||
|
||||
func (p *provider_redis) RevokeAll(account primitive.ObjectID) error {
|
||||
func (p *provider_redis) RevokeAll(account primitive.ObjectID, infinite bool) ([]string, error) {
|
||||
prefix := account.Hex()
|
||||
sks, err := p.redisClient.Keys(p.ctx, prefix+"*").Result()
|
||||
if err != nil {
|
||||
logger.Println("session provider delete :", sks, err)
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, sk := range sks {
|
||||
p.redisClient.HSet(p.ctx, sk, "inv", "true")
|
||||
p.redisClient.Publish(p.ctx, p.deleteChannel, sk).Result()
|
||||
if infinite {
|
||||
p.redisClient.Publish(p.ctx, p.deleteChannel, "~"+sk).Result()
|
||||
} else {
|
||||
p.redisClient.Publish(p.ctx, p.deleteChannel, sk).Result()
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
return sks, nil
|
||||
}
|
||||
|
||||
func (p *provider_redis) Query(pk string) (Authorization, error) {
|
||||
@ -181,11 +172,24 @@ func newConsumerWithRedis(ctx context.Context, redisUrl string, ttl time.Duratio
|
||||
|
||||
switch msg.Channel {
|
||||
case deleteChannel:
|
||||
sk := storagekey(msg.Payload)
|
||||
old := consumer.delete(sk)
|
||||
infinite := false
|
||||
var sk string
|
||||
if msg.Payload[0] == '~' {
|
||||
sk = msg.Payload[1:]
|
||||
infinite = true
|
||||
} else {
|
||||
sk = msg.Payload
|
||||
infinite = false
|
||||
}
|
||||
old := consumer.delete(storagekey(sk))
|
||||
if old != nil {
|
||||
invsess := InvalidatedSession{
|
||||
Account: old.Account,
|
||||
Infinite: infinite,
|
||||
}
|
||||
|
||||
for _, f := range consumer.onSessionInvalidated {
|
||||
f(old.Account)
|
||||
f(invsess)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -366,6 +370,6 @@ func (c *consumer_redis) IsRevoked(accid primitive.ObjectID) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *consumer_redis) RegisterOnSessionInvalidated(cb func(primitive.ObjectID)) {
|
||||
func (c *consumer_redis) RegisterOnSessionInvalidated(cb func(InvalidatedSession)) {
|
||||
c.onSessionInvalidated = append(c.onSessionInvalidated, cb)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user