mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00
feat: logout if app.conf's inactiveTimeoutMinutes is reached (#3244)
* feat: logout if there's no activities for a long time * fix: change the implementation of updating LastTime * fix: add logoutMinites to app.conf * fix: change the implementation of judgment statement * fix: use sync.Map to ensure thread safety * fix: syntax standards and Apache headers * fix: change the implementation of obtaining logoutMinutes in app.conf * fix: follow community code standards * fix: <=0 or empty means no restriction * Update logout_filter.go * Update app.conf * Update main.go * Update and rename logout_filter.go to timeout_filter.go * Update app.conf * Update timeout_filter.go * fix: update app.conf --------- Co-authored-by: Yang Luo <hsluoyz@qq.com>
This commit is contained in:
parent
c86ac8e6ad
commit
034f28def9
@ -23,6 +23,7 @@ isDemoMode = false
|
|||||||
batchSize = 100
|
batchSize = 100
|
||||||
enableErrorMask = false
|
enableErrorMask = false
|
||||||
enableGzip = true
|
enableGzip = true
|
||||||
|
inactiveTimeoutMinutes =
|
||||||
ldapServerPort = 389
|
ldapServerPort = 389
|
||||||
radiusServerPort = 1812
|
radiusServerPort = 1812
|
||||||
radiusSecret = "secret"
|
radiusSecret = "secret"
|
||||||
|
1
main.go
1
main.go
@ -56,6 +56,7 @@ func main() {
|
|||||||
beego.InsertFilter("*", beego.BeforeRouter, routers.StaticFilter)
|
beego.InsertFilter("*", beego.BeforeRouter, routers.StaticFilter)
|
||||||
beego.InsertFilter("*", beego.BeforeRouter, routers.AutoSigninFilter)
|
beego.InsertFilter("*", beego.BeforeRouter, routers.AutoSigninFilter)
|
||||||
beego.InsertFilter("*", beego.BeforeRouter, routers.CorsFilter)
|
beego.InsertFilter("*", beego.BeforeRouter, routers.CorsFilter)
|
||||||
|
beego.InsertFilter("*", beego.BeforeRouter, routers.TimeoutFilter)
|
||||||
beego.InsertFilter("*", beego.BeforeRouter, routers.ApiFilter)
|
beego.InsertFilter("*", beego.BeforeRouter, routers.ApiFilter)
|
||||||
beego.InsertFilter("*", beego.BeforeRouter, routers.PrometheusFilter)
|
beego.InsertFilter("*", beego.BeforeRouter, routers.PrometheusFilter)
|
||||||
beego.InsertFilter("*", beego.BeforeRouter, routers.RecordMessage)
|
beego.InsertFilter("*", beego.BeforeRouter, routers.RecordMessage)
|
||||||
|
64
routers/timeout_filter.go
Normal file
64
routers/timeout_filter.go
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// Copyright 2024 The Casdoor Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package routers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/beego/beego/context"
|
||||||
|
"github.com/casdoor/casdoor/conf"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
inactiveTimeoutMinutes int64
|
||||||
|
requestTimeMap sync.Map
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var err error
|
||||||
|
inactiveTimeoutMinutes, err = conf.GetConfigInt64("inactiveTimeoutMinutes")
|
||||||
|
if err != nil {
|
||||||
|
inactiveTimeoutMinutes = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func timeoutLogout(ctx *context.Context, sessionId string) {
|
||||||
|
requestTimeMap.Delete(sessionId)
|
||||||
|
ctx.Input.CruSession.Set("username", "")
|
||||||
|
ctx.Input.CruSession.Set("accessToken", "")
|
||||||
|
ctx.Input.CruSession.Delete("SessionData")
|
||||||
|
responseError(ctx, fmt.Sprintf(T(ctx, "auth:Timeout for inactivity of %d minutes"), inactiveTimeoutMinutes))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TimeoutFilter(ctx *context.Context) {
|
||||||
|
if inactiveTimeoutMinutes <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
owner, name := getSubject(ctx)
|
||||||
|
if owner == "anonymous" || name == "anonymous" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sessionId := ctx.Input.CruSession.SessionID()
|
||||||
|
currentTime := time.Now()
|
||||||
|
preRequestTime, has := requestTimeMap.Load(sessionId)
|
||||||
|
requestTimeMap.Store(sessionId, currentTime)
|
||||||
|
if has && preRequestTime.(time.Time).Add(time.Minute*time.Duration(inactiveTimeoutMinutes)).Before(currentTime) {
|
||||||
|
timeoutLogout(ctx, sessionId)
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user