mirror of
https://github.com/weloe/token-go.git
synced 2025-10-05 15:36:50 +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 {
|
if tokenConfig == nil || adapter == nil {
|
||||||
return nil, errors.New("InitWithConfig() failed: parameters cannot be nil")
|
return nil, errors.New("InitWithConfig() failed: parameters cannot be nil")
|
||||||
}
|
}
|
||||||
return &Enforcer{
|
e := &Enforcer{
|
||||||
loginType: "user",
|
loginType: "user",
|
||||||
config: *tokenConfig,
|
config: *tokenConfig,
|
||||||
generateFunc: fm,
|
generateFunc: fm,
|
||||||
adapter: adapter,
|
adapter: adapter,
|
||||||
logger: &log.DefaultLogger{},
|
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) {
|
func (e *Enforcer) SetType(t string) {
|
||||||
|
@@ -44,6 +44,7 @@ func TestNewEnforcer(t *testing.T) {
|
|||||||
IsConcurrent: false,
|
IsConcurrent: false,
|
||||||
IsShare: false,
|
IsShare: false,
|
||||||
MaxLoginCount: -1,
|
MaxLoginCount: -1,
|
||||||
|
DataRefreshPeriod: -1,
|
||||||
}
|
}
|
||||||
logger := &log.DefaultLogger{}
|
logger := &log.DefaultLogger{}
|
||||||
|
|
||||||
@@ -131,6 +132,7 @@ func NewTestNotConcurrentEnforcer(t *testing.T) (error, *Enforcer, ctx.Context)
|
|||||||
tokenConfig := config.DefaultTokenConfig()
|
tokenConfig := config.DefaultTokenConfig()
|
||||||
tokenConfig.IsConcurrent = false
|
tokenConfig.IsConcurrent = false
|
||||||
tokenConfig.IsShare = false
|
tokenConfig.IsShare = false
|
||||||
|
tokenConfig.DataRefreshPeriod = 30
|
||||||
|
|
||||||
enforcer, err := NewEnforcer(tokenConfig, adapter)
|
enforcer, err := NewEnforcer(tokenConfig, adapter)
|
||||||
return err, enforcer, ctx
|
return err, enforcer, ctx
|
||||||
|
@@ -11,6 +11,10 @@ type DefaultLogger struct {
|
|||||||
enable bool
|
enable bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DefaultLogger) StartCleanTimer(period int64) {
|
||||||
|
log.Printf("timer period = %v, timer start", period)
|
||||||
|
}
|
||||||
|
|
||||||
func (d *DefaultLogger) Enable(bool bool) {
|
func (d *DefaultLogger) Enable(bool bool) {
|
||||||
d.enable = bool
|
d.enable = bool
|
||||||
}
|
}
|
||||||
|
@@ -10,4 +10,7 @@ type Logger interface {
|
|||||||
|
|
||||||
// IsEnabled return if logger is enabled
|
// IsEnabled return if logger is enabled
|
||||||
IsEnabled() bool
|
IsEnabled() bool
|
||||||
|
|
||||||
|
// StartCleanTimer log after start clean timer
|
||||||
|
StartCleanTimer(period int64)
|
||||||
}
|
}
|
||||||
|
@@ -12,6 +12,7 @@ import (
|
|||||||
type DefaultAdapter struct {
|
type DefaultAdapter struct {
|
||||||
dataMap *sync.Map
|
dataMap *sync.Map
|
||||||
expireMap *sync.Map
|
expireMap *sync.Map
|
||||||
|
once sync.Once
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ Adapter = (*DefaultAdapter)(nil)
|
var _ Adapter = (*DefaultAdapter)(nil)
|
||||||
@@ -168,3 +169,27 @@ func (d *DefaultAdapter) getTimeout(key string) int64 {
|
|||||||
}
|
}
|
||||||
return timeout
|
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) {
|
func TestDefaultAdapter_DeleteBatchFilteredValue(t *testing.T) {
|
||||||
adapter := NewTestDefaultAdapter()
|
adapter := NewTestDefaultAdapter()
|
||||||
|
adapter.(*DefaultAdapter).StartCleanTimer(2)
|
||||||
if err := adapter.SetStr("k_1", "v", -1); err != nil {
|
if err := adapter.SetStr("k_1", "v", -1); err != nil {
|
||||||
t.Errorf("SetStr() failed: %v", err)
|
t.Errorf("SetStr() failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -198,4 +199,5 @@ func TestDefaultAdapter_DeleteBatchFilteredValue(t *testing.T) {
|
|||||||
if str != "" {
|
if str != "" {
|
||||||
t.Errorf("DeleteBatchFilteredKey() failed")
|
t.Errorf("DeleteBatchFilteredKey() failed")
|
||||||
}
|
}
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user