diff --git a/src/Adapters/DatabaseAdapter.php b/src/Adapters/DatabaseAdapter.php index 72e2d21..2709253 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('v' . $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()); + } }