From 71c8c84e300cf8b276f28e21e555a39ad793d65c Mon Sep 17 00:00:00 2001 From: George Date: Mon, 17 Jun 2024 11:44:19 +0800 Subject: [PATCH] feat: CachedEnforcer does not clean the result cached in memory when call ClearPolicy method (#1413) * fix: CachedEnforcer does not clean the result cached in memory when call ClearPolicy method * fix: remove redundant return statement --- enforcer_cached.go | 11 +++++++++++ enforcer_cached_test.go | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/enforcer_cached.go b/enforcer_cached.go index 1e72a9761..b89bad78d 100644 --- a/enforcer_cached.go +++ b/enforcer_cached.go @@ -172,3 +172,14 @@ func GetCacheKey(params ...interface{}) (string, bool) { } return key.String(), true } + +// ClearPolicy clears all policy. +func (e *CachedEnforcer) ClearPolicy() { + if atomic.LoadInt32(&e.enableCache) != 0 { + if err := e.cache.Clear(); err != nil { + e.logger.LogError(err, "clear cache failed") + return + } + } + e.Enforcer.ClearPolicy() +} diff --git a/enforcer_cached_test.go b/enforcer_cached_test.go index 7af7a3ccb..34da2fa0f 100644 --- a/enforcer_cached_test.go +++ b/enforcer_cached_test.go @@ -57,4 +57,17 @@ func TestCache(t *testing.T) { testEnforceCache(t, e, "bob", "data2", "write", false) testEnforceCache(t, e, "alice", "data2", "read", true) testEnforceCache(t, e, "alice", "data2", "write", true) + + e, _ = NewCachedEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv") + testEnforceCache(t, e, "alice", "data1", "read", true) + testEnforceCache(t, e, "bob", "data2", "write", true) + testEnforceCache(t, e, "alice", "data2", "read", true) + testEnforceCache(t, e, "alice", "data2", "write", true) + + e.ClearPolicy() + + testEnforceCache(t, e, "alice", "data1", "read", false) + testEnforceCache(t, e, "bob", "data2", "write", false) + testEnforceCache(t, e, "alice", "data2", "read", false) + testEnforceCache(t, e, "alice", "data2", "write", false) }