feat: support Casbin UpdatableAdapter interface

This commit is contained in:
basakest 2021-03-20 20:21:44 +08:00
parent ad06ec509d
commit 1fc94638d9
3 changed files with 62 additions and 1 deletions

View File

@ -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);
}
}

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('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());
}
}