From 2f9945a27a0b40ebea634dd2efdb2f2783ccd7c4 Mon Sep 17 00:00:00 2001 From: basakest Date: Wed, 28 Jul 2021 18:35:03 +0800 Subject: [PATCH] feat: support updatePolicies method, fix #27 --- src/Adapters/DatabaseAdapter.php | 18 ++++++++++++++++++ tests/DatabaseAdapterTest.php | 28 ++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/Adapters/DatabaseAdapter.php b/src/Adapters/DatabaseAdapter.php index 9c8a1be..a5bf8a5 100755 --- a/src/Adapters/DatabaseAdapter.php +++ b/src/Adapters/DatabaseAdapter.php @@ -224,6 +224,24 @@ class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterCo Rule::fireModelEvent('saved'); } + /** + * UpdatePolicies updates some policy rules to storage, like db, redis. + * + * @param string $sec + * @param string $ptype + * @param string[][] $oldRules + * @param string[][] $newRules + * @return void + */ + public function updatePolicies(string $sec, string $ptype, array $oldRules, array $newRules): void + { + DB::transaction(function () use ($sec, $ptype, $oldRules, $newRules) { + foreach ($oldRules as $i => $oldRule) { + $this->updatePolicy($sec, $ptype, $oldRule, $newRules[$i]); + } + }); + } + /** * Loads only policy rules that match the filter. * diff --git a/tests/DatabaseAdapterTest.php b/tests/DatabaseAdapterTest.php index 9fe0459..6e1ce7e 100644 --- a/tests/DatabaseAdapterTest.php +++ b/tests/DatabaseAdapterTest.php @@ -131,6 +131,34 @@ class DatabaseAdapterTest extends TestCase ], Enforcer::getPolicy()); } + public function testUpdatePolicies() + { + $this->assertEquals([ + ['alice', 'data1', 'read'], + ['bob', 'data2', 'write'], + ['data2_admin', 'data2', 'read'], + ['data2_admin', 'data2', 'write'], + ], Enforcer::getPolicy()); + + $oldPolicies = [ + ['alice', 'data1', 'read'], + ['bob', 'data2', 'write'] + ]; + $newPolicies = [ + ['alice', 'data1', 'write'], + ['bob', 'data2', 'read'] + ]; + + Enforcer::updatePolicies($oldPolicies, $newPolicies); + + $this->assertEquals([ + ['alice', 'data1', 'write'], + ['bob', 'data2', 'read'], + ['data2_admin', 'data2', 'read'], + ['data2_admin', 'data2', 'write'], + ], Enforcer::getPolicy()); + } + public function testLoadFilteredPolicy() { $this->initTable();