feat: update cache; fix: user logout

This commit is contained in:
loveuer
2025-01-14 00:42:18 -08:00
parent 534b9586f2
commit 32b30ae183
16 changed files with 281 additions and 127 deletions

View File

@ -9,6 +9,7 @@ import (
"ultone/internal/controller"
"ultone/internal/database/cache"
"ultone/internal/database/db"
"ultone/internal/log"
"ultone/internal/middleware/oplog"
"ultone/internal/model"
"ultone/internal/opt"
@ -75,26 +76,27 @@ func AuthLogin(c *nf.Ctx) error {
if !opt.MultiLogin {
var (
last = fmt.Sprintf("%s:user:last_token:%d", opt.CachePrefix, target.Id)
bs []byte
lastKey = fmt.Sprintf("%s:user:last_token:%d", opt.CachePrefix, target.Id)
lastToken string
)
// 获取之前的 token
if bs, err = cache.Client.Get(tool.Timeout(3), last); err == nil {
key := fmt.Sprintf("%s:user:token:%s", opt.CachePrefix, string(bs))
_ = cache.Client.Del(tool.Timeout(3), key)
if err = cache.Client.GetScan(tool.Timeout(3), lastKey).Scan(&lastToken); err != nil {
if !errors.Is(err, cache.ErrorKeyNotFound) {
log.Warn(c.Context(), "handler.AuthLogin: get last token err = %v", err)
goto HandleMultiEnd
}
}
// 删掉之前的 token
if len(bs) > 0 {
_ = controller.UserController.RmToken(c.Context(), string(bs))
}
controller.UserController.RmToken(c.Context(), lastToken)
// 将当前的 token 存入 last_token
if err = cache.Client.Set(tool.Timeout(3), last, token); err != nil {
if err = cache.Client.Set(tool.Timeout(3), lastKey, token); err != nil {
return resp.Resp500(c, err.Error())
}
}
HandleMultiEnd:
c.Set("Set-Cookie", fmt.Sprintf("%s=%s; Path=/", opt.CookieName, token))
c.Locals("user", target)
@ -121,12 +123,28 @@ func AuthVerify(c *nf.Ctx) error {
}
func AuthLogout(c *nf.Ctx) error {
defer func() {
c.Set("Set-Cookie", fmt.Sprintf("%s=; Path=/; Max-Age=0", opt.CookieName))
}()
op, ok := c.Locals("user").(*model.User)
if !ok {
return resp.Resp401(c, nil)
}
_ = controller.UserController.RmUserCache(c.Context(), op.Id)
token, ok := c.Locals("token").(string)
if !ok {
return resp.Resp401(c, nil)
}
if !opt.MultiLogin {
_ = controller.UserController.RmUserCache(c.Context(), op.Id)
lastKey := fmt.Sprintf("%s:user:last_token:%d", opt.CachePrefix, op.Id)
cache.Client.Del(c.Context(), lastKey)
}
// 删掉之前的 token
controller.UserController.RmToken(c.Context(), token)
c.Locals(opt.OpLogLocalKey, &oplog.OpLog{
Type: model.OpLogTypeLogout,