Merge pull request #12 from basakest/UpdatableDatabaseAdapter

feat: support Casbin UpdatableAdapter interface
This commit is contained in:
Jon Lee 2021-03-22 11:51:37 +08:00 committed by GitHub
commit bb566321bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 1 deletions

View File

@ -7,6 +7,7 @@ namespace Lauthz\Adapters;
use Lauthz\Models\Rule; use Lauthz\Models\Rule;
use Lauthz\Contracts\DatabaseAdapter as DatabaseAdapterContract; use Lauthz\Contracts\DatabaseAdapter as DatabaseAdapterContract;
use Lauthz\Contracts\BatchDatabaseAdapter as BatchDatabaseAdapterContract; use Lauthz\Contracts\BatchDatabaseAdapter as BatchDatabaseAdapterContract;
use Lauthz\Contracts\UpdatableDatabaseAdapter as UpdatableDatabaseAdapterContract;
use Casbin\Model\Model; use Casbin\Model\Model;
use Casbin\Persist\AdapterHelper; use Casbin\Persist\AdapterHelper;
use DateTime; use DateTime;
@ -15,7 +16,7 @@ use DateTime;
* *
* @author techlee@qq.com * @author techlee@qq.com
*/ */
class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterContract class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterContract, UpdatableDatabaseAdapterContract
{ {
use AdapterHelper; 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);
}
} }

View File

@ -0,0 +1,9 @@
<?php
namespace Lauthz\Contracts;
use Casbin\Persist\UpdatableAdapter;
interface UpdatableDatabaseAdapter extends UpdatableAdapter
{
}

View File

@ -101,4 +101,31 @@ class DatabaseAdapterTest extends TestCase
$this->assertFalse(Enforcer::enforce('bob', 'data2', 'write')); $this->assertFalse(Enforcer::enforce('bob', 'data2', 'write'));
$this->assertFalse(Enforcer::enforce('alice', '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());
}
} }