refactor: extract deleteRedundantTokenSign method

This commit is contained in:
weloe
2023-11-04 19:15:24 +08:00
parent c85d2c4047
commit 50afce1ace
2 changed files with 45 additions and 61 deletions

View File

@@ -269,39 +269,12 @@ func (e *Enforcer) LoginByModel(id string, loginModel *model.Login, ctx ctx.Cont
if device != "" && tokenConfig.DeviceMaxLoginCount != -1 {
if session = e.GetSession(id); session != nil {
// get by login device
tokenSignList := session.GetFilterTokenSign(device)
if tokenSignList.Len() > int(tokenConfig.DeviceMaxLoginCount) {
// if loginCount > maxLoginCount, logout account until single device Login count is equal to DeviceMaxLoginCount
for element := tokenSignList.Front(); element != nil; element = element.Next() {
if tokenSign, ok := element.Value.(*model.TokenSign); ok {
if session.TokenSignSize() > int(tokenConfig.DeviceMaxLoginCount) {
// delete tokenSign
tokenSignValue := tokenSign.Value
session.RemoveTokenSign(tokenSignValue)
err = e.UpdateSession(id, session)
tokenSignList := session.GetFilterTokenSignSlice(device)
if len(tokenSignList) > int(tokenConfig.DeviceMaxLoginCount) {
err = e.deleteRedundantTokenSign(session, tokenConfig.DeviceMaxLoginCount)
if err != nil {
return "", err
}
// delete token-id
err = e.deleteIdByToken(tokenSignValue)
if err != nil {
return "", err
}
e.logger.Logout(e.loginType, id, tokenSignValue)
if e.watcher != nil {
e.watcher.Logout(e.loginType, id, tokenSignValue)
}
}
}
}
// check TokenSignList length, if length == 0, delete this session
if session != nil && session.TokenSignSize() == 0 {
err = e.DeleteSession(id)
if err != nil {
return "", err
}
}
}
}
}
@@ -312,36 +285,10 @@ func (e *Enforcer) LoginByModel(id string, loginModel *model.Login, ctx ctx.Cont
if session.TokenSignSize() <= int(tokenConfig.MaxLoginCount) {
return tokenValue, nil
}
// logout account until loginCount == maxLoginCount if loginCount > maxLoginCount
for _, tokenSign := range session.TokenSignList {
if session.TokenSignSize() > int(tokenConfig.MaxLoginCount) {
// delete tokenSign
tokenSignValue := tokenSign.Value
session.RemoveTokenSign(tokenSignValue)
err = e.UpdateSession(id, session)
err = e.deleteRedundantTokenSign(session, tokenConfig.MaxLoginCount)
if err != nil {
return "", err
}
// delete token-id
err = e.deleteIdByToken(tokenSignValue)
if err != nil {
return "", err
}
e.logger.Logout(e.loginType, id, tokenSignValue)
if e.watcher != nil {
e.watcher.Logout(e.loginType, id, tokenSignValue)
}
}
}
// check TokenSignList length, if length == 0, delete this session
if session != nil && session.TokenSignSize() == 0 {
err = e.DeleteSession(id)
if err != nil {
return "", err
}
}
}
}

View File

@@ -103,6 +103,43 @@ func (e *Enforcer) ResponseToken(tokenValue string, loginModel *model.Login, ctx
return nil
}
// Delete the tokens to a specified number
func (e *Enforcer) deleteRedundantTokenSign(session *model.Session, number int16) error {
var err error
id := session.LoginId
// logout account until loginCount == maxLoginCount if loginCount > maxLoginCount
for _, tokenSign := range session.TokenSignList {
if session.TokenSignSize() > int(number) {
// delete tokenSign
tokenSignValue := tokenSign.Value
session.RemoveTokenSign(tokenSignValue)
err = e.UpdateSession(id, session)
if err != nil {
return err
}
// delete token-id
err = e.deleteIdByToken(tokenSignValue)
if err != nil {
return err
}
e.logger.Logout(e.loginType, id, tokenSignValue)
if e.watcher != nil {
e.watcher.Logout(e.loginType, id, tokenSignValue)
}
}
}
// check TokenSignList length, if length == 0, delete this session
if session != nil && session.TokenSignSize() == 0 {
err = e.DeleteSession(id)
if err != nil {
return err
}
}
return nil
}
// checkId check id
func (e *Enforcer) checkId(str string) (bool, error) {
i, err := strconv.Atoi(str)