mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-02 22:10:26 +08:00
增加清理老登录SESSION API
This commit is contained in:
@@ -84,7 +84,6 @@ func (this *LoginSessionDAO) WriteSessionValue(tx *dbs.Tx, sid string, key strin
|
||||
return err
|
||||
}
|
||||
var sessionId int64
|
||||
var isNewSession = false
|
||||
var valueMap = maps.Map{}
|
||||
if sessionOne != nil {
|
||||
var session = sessionOne.(*LoginSession)
|
||||
@@ -113,7 +112,6 @@ func (this *LoginSessionDAO) WriteSessionValue(tx *dbs.Tx, sid string, key strin
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
isNewSession = true
|
||||
}
|
||||
|
||||
var sessionOp = NewLoginSessionOperator()
|
||||
@@ -133,24 +131,17 @@ func (this *LoginSessionDAO) WriteSessionValue(tx *dbs.Tx, sid string, key strin
|
||||
if adminId > 0 || userId > 0 {
|
||||
sessionOp.AdminId = adminId
|
||||
sessionOp.UserId = userId
|
||||
|
||||
if isNewSession {
|
||||
// 删除此用户之前创建的SESSION,不再保存以往的SESSION,避免安全问题
|
||||
err = this.Query(tx).
|
||||
ResultPk().
|
||||
Attr("adminId", adminId).
|
||||
Attr("userId", userId).
|
||||
Neq("sid", sid).
|
||||
DeleteQuickly()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 写入数据
|
||||
valueMap[key] = value
|
||||
sessionOp.Values = valueMap.AsJSON()
|
||||
|
||||
// IP
|
||||
if key == "@ip" {
|
||||
sessionOp.Ip = value
|
||||
}
|
||||
|
||||
return this.Save(tx, sessionOp)
|
||||
}
|
||||
|
||||
@@ -182,3 +173,45 @@ func (this *LoginSessionDAO) FindSession(tx *dbs.Tx, sid string) (*LoginSession,
|
||||
}
|
||||
return session, nil
|
||||
}
|
||||
|
||||
func (this *LoginSessionDAO) ClearOldSessions(tx *dbs.Tx, adminId int64, userId int64, sid string, ip string) error {
|
||||
// 删除此用户之前创建的SESSION
|
||||
err := this.Query(tx).
|
||||
Attr("adminId", adminId).
|
||||
Attr("userId", userId).
|
||||
Neq("sid", sid).
|
||||
Neq("ip", ip). // 同一个IP允许多个SID,因为有人可能会同时使用手机端和PC端
|
||||
DeleteQuickly()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 删除过多的SESSION
|
||||
oldOnes, queryErr := this.Query(tx).
|
||||
ResultPk().
|
||||
Attr("adminId", adminId).
|
||||
Attr("userId", userId).
|
||||
Neq("sid", sid).
|
||||
AscPk().
|
||||
FindAll()
|
||||
if queryErr != nil {
|
||||
return queryErr
|
||||
}
|
||||
var oldCount = len(oldOnes)
|
||||
if oldCount > 3 {
|
||||
for _, oldOne := range oldOnes[:oldCount-3] {
|
||||
var oldId = oldOne.(*LoginSession).Id
|
||||
if oldOne.(*LoginSession).Sid == sid {
|
||||
continue
|
||||
}
|
||||
err = this.Query(tx).
|
||||
Pk(oldId).
|
||||
DeleteQuickly()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -84,3 +84,31 @@ func (this *LoginSessionService) FindLoginSession(ctx context.Context, req *pb.F
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
// ClearOldLoginSessions 清理老的SESSION
|
||||
func (this *LoginSessionService) ClearOldLoginSessions(ctx context.Context, req *pb.ClearOldLoginSessionsRequest) (*pb.RPCSuccess, error) {
|
||||
_, _, err := this.ValidateAdminAndUser(ctx, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(req.Sid) == 0 {
|
||||
return nil, errors.New("'token' should not be empty")
|
||||
}
|
||||
|
||||
var tx = this.NullTx()
|
||||
session, err := models.SharedLoginSessionDAO.FindSession(tx, req.Sid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if session == nil || !session.IsAvailable() {
|
||||
return nil, errors.New("invalid sid")
|
||||
}
|
||||
|
||||
err = models.SharedLoginSessionDAO.ClearOldSessions(tx, int64(session.AdminId), int64(session.UserId), req.Sid, req.Ip)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return this.Success()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user