feat: support Casbin UpdatableAdapter interface
This commit is contained in:
parent
ad06ec509d
commit
1fc94638d9
|
@ -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($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('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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue