mirror of
https://github.com/weloe/token-go.git
synced 2025-09-27 20:02:12 +08:00
feat: improve defaultAdapter to add clean timer
This commit is contained in:
20
enforcer.go
20
enforcer.go
@@ -100,13 +100,29 @@ func InitWithConfig(tokenConfig *config.TokenConfig, adapter persist.Adapter) (*
|
||||
if tokenConfig == nil || adapter == nil {
|
||||
return nil, errors.New("InitWithConfig() failed: parameters cannot be nil")
|
||||
}
|
||||
return &Enforcer{
|
||||
e := &Enforcer{
|
||||
loginType: "user",
|
||||
config: *tokenConfig,
|
||||
generateFunc: fm,
|
||||
adapter: adapter,
|
||||
logger: &log.DefaultLogger{},
|
||||
}, nil
|
||||
}
|
||||
|
||||
e.startCleanTimer()
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
// if e.adapter.(type) == *persist.DefaultAdapter, can start cleanTimer
|
||||
func (e *Enforcer) startCleanTimer() {
|
||||
defaultAdapter, ok := e.adapter.(*persist.DefaultAdapter)
|
||||
if ok {
|
||||
dataRefreshPeriod := e.config.DataRefreshPeriod
|
||||
if period := dataRefreshPeriod; period >= 0 {
|
||||
defaultAdapter.StartCleanTimer(dataRefreshPeriod)
|
||||
e.logger.StartCleanTimer(dataRefreshPeriod)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Enforcer) SetType(t string) {
|
||||
|
@@ -36,14 +36,15 @@ func TestNewEnforcer(t *testing.T) {
|
||||
t.Errorf("NewHttpContext failed: %v", ctx)
|
||||
}
|
||||
tokenConfig := &config.TokenConfig{
|
||||
TokenName: "testToken",
|
||||
Timeout: 60,
|
||||
IsReadCookie: true,
|
||||
IsReadHeader: true,
|
||||
IsReadBody: false,
|
||||
IsConcurrent: false,
|
||||
IsShare: false,
|
||||
MaxLoginCount: -1,
|
||||
TokenName: "testToken",
|
||||
Timeout: 60,
|
||||
IsReadCookie: true,
|
||||
IsReadHeader: true,
|
||||
IsReadBody: false,
|
||||
IsConcurrent: false,
|
||||
IsShare: false,
|
||||
MaxLoginCount: -1,
|
||||
DataRefreshPeriod: -1,
|
||||
}
|
||||
logger := &log.DefaultLogger{}
|
||||
|
||||
@@ -131,6 +132,7 @@ func NewTestNotConcurrentEnforcer(t *testing.T) (error, *Enforcer, ctx.Context)
|
||||
tokenConfig := config.DefaultTokenConfig()
|
||||
tokenConfig.IsConcurrent = false
|
||||
tokenConfig.IsShare = false
|
||||
tokenConfig.DataRefreshPeriod = 30
|
||||
|
||||
enforcer, err := NewEnforcer(tokenConfig, adapter)
|
||||
return err, enforcer, ctx
|
||||
|
@@ -11,6 +11,10 @@ type DefaultLogger struct {
|
||||
enable bool
|
||||
}
|
||||
|
||||
func (d *DefaultLogger) StartCleanTimer(period int64) {
|
||||
log.Printf("timer period = %v, timer start", period)
|
||||
}
|
||||
|
||||
func (d *DefaultLogger) Enable(bool bool) {
|
||||
d.enable = bool
|
||||
}
|
||||
|
@@ -10,4 +10,7 @@ type Logger interface {
|
||||
|
||||
// IsEnabled return if logger is enabled
|
||||
IsEnabled() bool
|
||||
|
||||
// StartCleanTimer log after start clean timer
|
||||
StartCleanTimer(period int64)
|
||||
}
|
||||
|
@@ -12,6 +12,7 @@ import (
|
||||
type DefaultAdapter struct {
|
||||
dataMap *sync.Map
|
||||
expireMap *sync.Map
|
||||
once sync.Once
|
||||
}
|
||||
|
||||
var _ Adapter = (*DefaultAdapter)(nil)
|
||||
@@ -168,3 +169,27 @@ func (d *DefaultAdapter) getTimeout(key string) int64 {
|
||||
}
|
||||
return timeout
|
||||
}
|
||||
|
||||
func (d *DefaultAdapter) StartCleanTimer(period int64) {
|
||||
d.once.Do(func() {
|
||||
go d.CleanTask(period)
|
||||
})
|
||||
}
|
||||
|
||||
func (d *DefaultAdapter) CleanTask(period int64) {
|
||||
if period < 0 {
|
||||
return
|
||||
}
|
||||
duration := period
|
||||
|
||||
// create timer
|
||||
ticker := time.NewTicker(time.Duration(duration) * time.Second)
|
||||
defer ticker.Stop()
|
||||
|
||||
for range ticker.C {
|
||||
d.expireMap.Range(func(key, value any) bool {
|
||||
_ = d.getExpireAndDelete(key.(string))
|
||||
return true
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@@ -181,6 +181,7 @@ func TestDefaultAdapter_InterfaceOperation(t *testing.T) {
|
||||
|
||||
func TestDefaultAdapter_DeleteBatchFilteredValue(t *testing.T) {
|
||||
adapter := NewTestDefaultAdapter()
|
||||
adapter.(*DefaultAdapter).StartCleanTimer(2)
|
||||
if err := adapter.SetStr("k_1", "v", -1); err != nil {
|
||||
t.Errorf("SetStr() failed: %v", err)
|
||||
}
|
||||
@@ -198,4 +199,5 @@ func TestDefaultAdapter_DeleteBatchFilteredValue(t *testing.T) {
|
||||
if str != "" {
|
||||
t.Errorf("DeleteBatchFilteredKey() failed")
|
||||
}
|
||||
time.Sleep(5 * time.Second)
|
||||
}
|
||||
|
Reference in New Issue
Block a user