Merge pull request #12 from basakest/UpdatableDatabaseAdapter
feat: support Casbin UpdatableAdapter interface
This commit is contained in:
commit
bb566321bb
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace Lauthz\Contracts;
|
||||
|
||||
use Casbin\Persist\UpdatableAdapter;
|
||||
|
||||
interface UpdatableDatabaseAdapter extends UpdatableAdapter
|
||||
{
|
||||
}
|
|
@ -101,4 +101,31 @@ class DatabaseAdapterTest extends TestCase
|
|||
$this->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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue