Delete previous session tokens at login
This commit is contained in:
parent
31c41b339e
commit
f1abbc5a07
@ -88,6 +88,11 @@ func (c AuthController) Login(username string, password string) (string, bool, e
|
||||
return "", false, err
|
||||
}
|
||||
|
||||
err = c.sessionDAO.DeleteAllByID(user.ID)
|
||||
if err != nil {
|
||||
return "", false, err
|
||||
}
|
||||
|
||||
err = c.sessionDAO.Set(token, user.ID)
|
||||
if err != nil {
|
||||
return "", false, err
|
||||
|
@ -4,5 +4,6 @@ type ISessionDAO interface {
|
||||
Set(token string, id int) error
|
||||
Get(token string) (int, error)
|
||||
Delete(token string) error
|
||||
DeleteAllByID(id int) error
|
||||
Bump(token string, time int) error
|
||||
}
|
||||
|
@ -34,6 +34,55 @@ func (d SessionDAOVK) Delete(token string) error {
|
||||
return (*d.vk).Do(context.Background(), cmd).Error()
|
||||
}
|
||||
|
||||
func (d SessionDAOVK) DeleteAllByID(id int) error {
|
||||
// iterate all session keys
|
||||
var cursor uint64 = 0
|
||||
pattern := SESSION_PREFIX + "*"
|
||||
for {
|
||||
cmd := (*d.vk).B().Scan().Cursor(cursor).Match(pattern).Build()
|
||||
|
||||
result := (*d.vk).Do(context.Background(), cmd)
|
||||
if err := result.Error(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
entry, err := result.AsScanEntry()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, key := range entry.Elements {
|
||||
// get the value of the key
|
||||
cmd = (*d.vk).B().Get().Key(key).Build()
|
||||
|
||||
result := (*d.vk).Do(context.Background(), cmd)
|
||||
if err := result.Error(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value, err := result.AsInt64()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// check if the value is the same as our id
|
||||
if value == int64(id) {
|
||||
// if so, delete it
|
||||
cmd = (*d.vk).B().Del().Key(key).Build()
|
||||
result := (*d.vk).Do(context.Background(), cmd)
|
||||
if err := result.Error(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if cursor = entry.Cursor; cursor == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d SessionDAOVK) Bump(token string, time int) error {
|
||||
cmd := (*d.vk).B().Expire().Key(SESSION_PREFIX + token).Seconds(int64(time)).Build()
|
||||
return (*d.vk).Do(context.Background(), cmd).Error()
|
||||
|
Loading…
Reference in New Issue
Block a user