feat: add Dispatcher and UpdatableWatcher

This commit is contained in:
weloe
2023-10-18 17:43:51 +08:00
parent c5cc46eeef
commit 0216daedf1
6 changed files with 228 additions and 16 deletions

View File

@@ -22,9 +22,23 @@ type Enforcer struct {
adapter persist.Adapter adapter persist.Adapter
watcher persist.Watcher watcher persist.Watcher
logger log.Logger logger log.Logger
dispatcher persist.Dispatcher
notifyDispatcher bool
updatableWatcher persist.UpdatableWatcher
notifyUpdatableWatcher bool
authManager interface{} authManager interface{}
} }
func (e *Enforcer) EnableUpdatableWatcher(b bool) {
if e.updatableWatcher == nil {
return
}
e.notifyUpdatableWatcher = b
}
func NewDefaultAdapter() persist.Adapter { func NewDefaultAdapter() persist.Adapter {
return persist.NewDefaultAdapter() return persist.NewDefaultAdapter()
} }
@@ -482,7 +496,7 @@ func (e *Enforcer) GetSession(id string) *model.Session {
} }
func (e *Enforcer) SetSession(id string, session *model.Session, timeout int64) error { func (e *Enforcer) SetSession(id string, session *model.Session, timeout int64) error {
err := e.adapter.Set(e.spliceSessionKey(id), session, timeout) err := e.notifySet(e.spliceSessionKey(id), session, timeout)
if err != nil { if err != nil {
return err return err
} }
@@ -490,7 +504,7 @@ func (e *Enforcer) SetSession(id string, session *model.Session, timeout int64)
} }
func (e *Enforcer) DeleteSession(id string) error { func (e *Enforcer) DeleteSession(id string) error {
err := e.adapter.Delete(e.spliceSessionKey(id)) err := e.notifyDelete(e.spliceSessionKey(id))
if err != nil { if err != nil {
return err return err
} }
@@ -498,7 +512,7 @@ func (e *Enforcer) DeleteSession(id string) error {
} }
func (e *Enforcer) UpdateSession(id string, session *model.Session) error { func (e *Enforcer) UpdateSession(id string, session *model.Session) error {
err := e.adapter.Update(e.spliceSessionKey(id), session) err := e.notifyUpdate(e.spliceSessionKey(id), session)
if err != nil { if err != nil {
return err return err
} }

46
enforcer_distributed.go Normal file
View File

@@ -0,0 +1,46 @@
package token_go
import "github.com/weloe/token-go/persist"
type DistributedEnforcer struct {
*Enforcer
}
func NewDistributedEnforcer(enforcer *Enforcer) *DistributedEnforcer {
return &DistributedEnforcer{enforcer}
}
func (e *DistributedEnforcer) SetStrSelf(key string, value string, timeout int64) error {
return e.adapter.SetStr(key, value, timeout)
}
func (e *DistributedEnforcer) UpdateStrSelf(key string, value string) error {
return e.adapter.UpdateStr(key, value)
}
func (e *DistributedEnforcer) SetSelf(key string, value interface{}, timeout int64) error {
return e.adapter.Set(key, value, timeout)
}
func (e *DistributedEnforcer) UpdateSelf(key string, value interface{}) error {
return e.adapter.Update(key, value)
}
func (e *DistributedEnforcer) DeleteSelf(key string) error {
return e.adapter.DeleteStr(key)
}
func (e *DistributedEnforcer) UpdateTimeoutSelf(key string, timeout int64) error {
return e.adapter.UpdateTimeout(key, timeout)
}
func (e *DistributedEnforcer) EnableDispatcher(b bool) {
if e.dispatcher == nil {
return
}
e.notifyDispatcher = b
}
func (e *Enforcer) SetDispatcher(dispatcher persist.Dispatcher) {
e.dispatcher = dispatcher
}

View File

@@ -91,3 +91,21 @@ type IEnforcer interface {
UpdateSession(id string, session *model.Session) error UpdateSession(id string, session *model.Session) error
SetSession(id string, session *model.Session, timeout int64) error SetSession(id string, session *model.Session, timeout int64) error
} }
var _ IDistributedEnforcer = &DistributedEnforcer{}
type IDistributedEnforcer interface {
IEnforcer
// SetStrSelf store string in all instances
SetStrSelf(key string, value string, timeout int64) error
// UpdateStrSelf only update string value in all instances
UpdateStrSelf(key string, value string) error
// SetSelf store interface{} in all instances
SetSelf(key string, value interface{}, timeout int64) error
// UpdateSelf only update interface{} value in all instances
UpdateSelf(key string, value interface{}) error
// DeleteSelf delete interface{} value in all instances
DeleteSelf(key string) error
// UpdateTimeoutSelf update timeout in all instances
UpdateTimeoutSelf(key string, timeout int64) error
}

View File

@@ -114,7 +114,7 @@ func (e *Enforcer) checkId(str string) (bool, error) {
} }
func (e *Enforcer) SetIdByToken(id string, tokenValue string, timeout int64) error { func (e *Enforcer) SetIdByToken(id string, tokenValue string, timeout int64) error {
err := e.adapter.SetStr(e.spliceTokenKey(tokenValue), id, timeout) err := e.notifySetStr(e.spliceTokenKey(tokenValue), id, timeout)
return err return err
} }
@@ -123,22 +123,22 @@ func (e *Enforcer) getIdByToken(token string) string {
} }
func (e *Enforcer) deleteIdByToken(tokenValue string) error { func (e *Enforcer) deleteIdByToken(tokenValue string) error {
err := e.adapter.DeleteStr(e.spliceTokenKey(tokenValue)) err := e.notifyDelete(e.spliceTokenKey(tokenValue))
return err return err
} }
func (e *Enforcer) updateIdByToken(tokenValue string, id string) error { func (e *Enforcer) updateIdByToken(tokenValue string, id string) error {
err := e.adapter.UpdateStr(e.spliceTokenKey(tokenValue), id) err := e.notifyUpdateStr(e.spliceTokenKey(tokenValue), id)
return err return err
} }
func (e *Enforcer) setBanned(id string, service string, level int, time int64) error { func (e *Enforcer) setBanned(id string, service string, level int, time int64) error {
err := e.adapter.SetStr(e.spliceBannedKey(id, service), strconv.Itoa(level), time) err := e.notifySetStr(e.spliceBannedKey(id, service), strconv.Itoa(level), time)
return err return err
} }
func (e *Enforcer) deleteBanned(id string, service string) error { func (e *Enforcer) deleteBanned(id string, service string) error {
err := e.adapter.DeleteStr(e.spliceBannedKey(id, service)) err := e.notifyDelete(e.spliceBannedKey(id, service))
return err return err
} }
@@ -153,7 +153,7 @@ func (e *Enforcer) getBannedTime(id string, service string) int64 {
} }
func (e *Enforcer) setSecSafe(token string, service string, time int64) error { func (e *Enforcer) setSecSafe(token string, service string, time int64) error {
err := e.adapter.SetStr(e.spliceSecSafeKey(token, service), constant.DefaultSecondAuthValue, time) err := e.notifySetStr(e.spliceSecSafeKey(token, service), constant.DefaultSecondAuthValue, time)
return err return err
} }
@@ -168,12 +168,12 @@ func (e *Enforcer) getSecSafe(token string, service string) string {
} }
func (e *Enforcer) deleteSecSafe(token string, service string) error { func (e *Enforcer) deleteSecSafe(token string, service string) error {
err := e.adapter.DeleteStr(e.spliceSecSafeKey(token, service)) err := e.notifyDelete(e.spliceSecSafeKey(token, service))
return err return err
} }
func (e *Enforcer) setTempToken(service string, token string, value string, timeout int64) error { func (e *Enforcer) setTempToken(service string, token string, value string, timeout int64) error {
err := e.adapter.SetStr(e.spliceTempTokenKey(service, token), value, timeout) err := e.notifySetStr(e.spliceTempTokenKey(service, token), value, timeout)
return err return err
} }
@@ -182,11 +182,11 @@ func (e *Enforcer) getTimeoutByTempToken(service string, token string) int64 {
} }
func (e *Enforcer) deleteByTempToken(service string, tempToken string) error { func (e *Enforcer) deleteByTempToken(service string, tempToken string) error {
return e.adapter.DeleteStr(e.spliceTempTokenKey(service, tempToken)) return e.notifyDelete(e.spliceTempTokenKey(service, tempToken))
} }
func (e *Enforcer) createQRCode(id string, timeout int64) error { func (e *Enforcer) createQRCode(id string, timeout int64) error {
return e.adapter.Set(e.spliceQRCodeKey(id), model.NewQRCode(id), timeout) return e.notifySet(e.spliceQRCodeKey(id), model.NewQRCode(id), timeout)
} }
func (e *Enforcer) getQRCode(id string) *model.QRCode { func (e *Enforcer) getQRCode(id string) *model.QRCode {
@@ -213,11 +213,11 @@ func (e *Enforcer) getQRCodeTimeout(id string) int64 {
} }
func (e *Enforcer) updateQRCode(id string, qrCode *model.QRCode) error { func (e *Enforcer) updateQRCode(id string, qrCode *model.QRCode) error {
return e.adapter.Update(e.spliceQRCodeKey(id), qrCode) return e.notifyUpdate(e.spliceQRCodeKey(id), qrCode)
} }
func (e *Enforcer) deleteQRCode(id string) error { func (e *Enforcer) deleteQRCode(id string) error {
return e.adapter.Delete(e.spliceQRCodeKey(id)) return e.notifyDelete(e.spliceQRCodeKey(id))
} }
func (e *Enforcer) getByTempToken(service string, tempToken string) string { func (e *Enforcer) getByTempToken(service string, tempToken string) string {
@@ -253,3 +253,107 @@ func (e *Enforcer) spliceQRCodeKey(QRCodeId string) string {
func (e *Enforcer) SetJwtSecretKey(key string) { func (e *Enforcer) SetJwtSecretKey(key string) {
e.config.JwtSecretKey = key e.config.JwtSecretKey = key
} }
func (e *Enforcer) notifySetStr(key string, value string, timeout int64) error {
if e.shouldNotifyDispatcher() {
return e.dispatcher.SetAllStr(key, value, timeout)
}
err := e.adapter.SetStr(key, value, timeout)
if err != nil {
return err
}
if e.shouldNotifyUpdatableWatcher() {
return e.updatableWatcher.UpdateForSetStr(key, value, timeout)
}
return nil
}
func (e *Enforcer) notifyUpdateStr(key string, value string) error {
if e.shouldNotifyDispatcher() {
return e.dispatcher.UpdateAllStr(key, value)
}
err := e.adapter.UpdateStr(key, value)
if err != nil {
return err
}
if e.shouldNotifyUpdatableWatcher() {
return e.updatableWatcher.UpdateForUpdateStr(key, value)
}
return nil
}
func (e *Enforcer) notifySet(key string, value interface{}, timeout int64) error {
if e.shouldNotifyDispatcher() {
return e.dispatcher.SetAll(key, value, timeout)
}
err := e.adapter.Set(key, value, timeout)
if err != nil {
return err
}
if e.shouldNotifyUpdatableWatcher() {
return e.updatableWatcher.UpdateForSet(key, value, timeout)
}
return nil
}
func (e *Enforcer) notifyUpdate(key string, value interface{}) error {
if e.shouldNotifyDispatcher() {
return e.dispatcher.UpdateAll(key, value)
}
err := e.adapter.Update(key, value)
if err != nil {
return err
}
if e.shouldNotifyUpdatableWatcher() {
return e.updatableWatcher.UpdateForUpdate(key, value)
}
return nil
}
func (e *Enforcer) notifyDelete(key string) error {
if e.shouldNotifyDispatcher() {
return e.dispatcher.DeleteAll(key)
}
err := e.adapter.Delete(key)
if err != nil {
return err
}
if e.shouldNotifyUpdatableWatcher() {
return e.updatableWatcher.UpdateForDelete(key)
}
return nil
}
// nolint:golint,unused
func (e *Enforcer) notifyUpdateTimeout(key string, timeout int64) error {
if e.shouldNotifyDispatcher() {
return e.dispatcher.UpdateAllTimeout(key, timeout)
}
err := e.adapter.UpdateTimeout(key, timeout)
if err != nil {
return err
}
if e.shouldNotifyUpdatableWatcher() {
return e.updatableWatcher.UpdateForUpdateTimeout(key, timeout)
}
return nil
}
func (e *Enforcer) shouldNotifyDispatcher() bool {
if e.dispatcher != nil && e.notifyDispatcher {
return true
}
return false
}
func (e *Enforcer) shouldNotifyUpdatableWatcher() bool {
if e.updatableWatcher != nil && e.notifyUpdatableWatcher {
return true
}
return false
}
// nolint:golint,unused
func (e *Enforcer) shouldPersist() bool {
return e.adapter != nil
}

19
persist/dispatcher.go Normal file
View File

@@ -0,0 +1,19 @@
package persist
type Dispatcher interface {
// SetAllStr store string in all instances
SetAllStr(key string, value string, timeout int64) error
// UpdateAllStr only update string value in all instances
UpdateAllStr(key string, value string) error
// SetAll store interface{} in all instances
SetAll(key string, value interface{}, timeout int64) error
// UpdateAll only update interface{} value in all instances
UpdateAll(key string, value interface{}) error
// DeleteAll delete interface{} value in all instances
DeleteAll(key string) error
// UpdateAllTimeout update timeout in all instances
UpdateAllTimeout(key string, timeout int64) error
}

11
persist/watcher_update.go Normal file
View File

@@ -0,0 +1,11 @@
package persist
// UpdatableWatcher called when data updated
type UpdatableWatcher interface {
UpdateForSetStr(key string, value interface{}, timeout int64) error
UpdateForUpdateStr(key string, value interface{}) error
UpdateForSet(key string, value interface{}, timeout int64) error
UpdateForUpdate(key string, value interface{}) error
UpdateForDelete(key string) error
UpdateForUpdateTimeout(key string, timeout int64) error
}