Skip to content

Commit

Permalink
Merge pull request #12 from basakest/UpdatableDatabaseAdapter
Browse files Browse the repository at this point in the history
feat: support Casbin UpdatableAdapter interface
  • Loading branch information
leeqvip committed Mar 22, 2021
2 parents ad06ec5 + 64d576c commit bb56632
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 1 deletion.
27 changes: 26 additions & 1 deletion src/Adapters/DatabaseAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
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;
Expand All @@ -15,7 +16,7 @@
*
* @author techlee@qq.com
*/
class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterContract
class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterContract, UpdatableDatabaseAdapterContract
{
use AdapterHelper;

Expand Down Expand Up @@ -207,4 +208,28 @@ public function removeFilteredPolicy(string $sec, string $ptype, int $fieldIndex
}
}
}

/**
* 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);
}
}
9 changes: 9 additions & 0 deletions src/Contracts/UpdatableDatabaseAdapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace Lauthz\Contracts;

use Casbin\Persist\UpdatableAdapter;

interface UpdatableDatabaseAdapter extends UpdatableAdapter
{
}
27 changes: 27 additions & 0 deletions tests/DatabaseAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,31 @@ public function testRemoveFilteredPolicy()
$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());
}
}

0 comments on commit bb56632

Please sign in to comment.