From 1fc94638d99da9f7e32768b261b2024b3c37f28d Mon Sep 17 00:00:00 2001 From: basakest Date: Sat, 20 Mar 2021 20:21:44 +0800 Subject: [PATCH 1/2] feat: support Casbin UpdatableAdapter interface --- src/Adapters/DatabaseAdapter.php | 27 +++++++++++++++++++++- src/Contracts/UpdatableDatabaseAdapter.php | 9 ++++++++ tests/DatabaseAdapterTest.php | 27 ++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/Contracts/UpdatableDatabaseAdapter.php diff --git a/src/Adapters/DatabaseAdapter.php b/src/Adapters/DatabaseAdapter.php index 72e2d21..098d9b8 100755 --- a/src/Adapters/DatabaseAdapter.php +++ b/src/Adapters/DatabaseAdapter.php @@ -7,6 +7,7 @@ namespace Lauthz\Adapters; use Lauthz\Models\Rule; use Lauthz\Contracts\DatabaseAdapter as DatabaseAdapterContract; use Lauthz\Contracts\BatchDatabaseAdapter as BatchDatabaseAdapterContract; +use Lauthz\Contracts\UpdatableDatabaseAdapter as UpdatableDatabaseAdapterContract; use Casbin\Model\Model; use Casbin\Persist\AdapterHelper; use DateTime; @@ -15,7 +16,7 @@ use DateTime; * * @author techlee@qq.com */ -class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterContract +class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterContract, UpdatableDatabaseAdapterContract { use AdapterHelper; @@ -207,4 +208,28 @@ class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterCo } } } + + /** + * Updates a policy rule from storage. + * This is part of the Auto-Save feature. + * + * @param string $sec + * @param string $ptype + * @param string[] $oldRule + * @param string[] $newPolicy + */ + public function updatePolicy(string $sec, string $ptype, array $oldRule, array $newPolicy): void + { + $instance = $this->eloquent->where('p_type', $ptype); + foreach($oldRule as $k => $v) { + $instance->where($k, $v); + } + $instance->first(); + $update = []; + foreach($newPolicy as $k => $v) { + $item = 'v' . $k; + $update[$item] = $k; + } + $instance->update($update); + } } diff --git a/src/Contracts/UpdatableDatabaseAdapter.php b/src/Contracts/UpdatableDatabaseAdapter.php new file mode 100644 index 0000000..581f410 --- /dev/null +++ b/src/Contracts/UpdatableDatabaseAdapter.php @@ -0,0 +1,9 @@ +assertFalse(Enforcer::enforce('bob', 'data2', 'write')); $this->assertFalse(Enforcer::enforce('alice', 'data2', 'write')); } + + public function testUpdatePolicy() + { + $this->assertEquals([ + ['alice', 'data1', 'read'], + ['bob', 'data2', 'write'], + ['data2_admin', 'data2', 'read'], + ['data2_admin', 'data2', 'write'], + ], Enforcer::getPolicy()); + + Enforcer::updatePolicy( + ['alice', 'data1', 'read'], + ['alice', 'data1', 'write'] + ); + + Enforcer::updatePolicy( + ['bob', 'data2', 'write'], + ['bob', 'data2', 'read'] + ); + + $this->assertEquals([ + ['alice', 'data1', 'write'], + ['bob', 'data2', 'read'], + ['data2_admin', 'data2', 'read'], + ['data2_admin', 'data2', 'write'], + ], Enforcer::getPolicy()); + } } From 64d576ce28cc47b1b7cb3da61fd24f8859d6f285 Mon Sep 17 00:00:00 2001 From: basakest Date: Sat, 20 Mar 2021 20:25:55 +0800 Subject: [PATCH 2/2] feat: support Casbin UpdatableAdapter interface --- src/Adapters/DatabaseAdapter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Adapters/DatabaseAdapter.php b/src/Adapters/DatabaseAdapter.php index 098d9b8..2709253 100755 --- a/src/Adapters/DatabaseAdapter.php +++ b/src/Adapters/DatabaseAdapter.php @@ -222,7 +222,7 @@ class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterCo { $instance = $this->eloquent->where('p_type', $ptype); foreach($oldRule as $k => $v) { - $instance->where($k, $v); + $instance->where('v' . $k, $v); } $instance->first(); $update = [];