Skip to content

Commit e297217

Browse files
author
Mathieu Decaffmeyer
committed
Added ability to set a default resource matcher
1 parent a41bb3a commit e297217

File tree

4 files changed

+39
-6
lines changed

4 files changed

+39
-6
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
},
2929
"extra": {
3030
"branch-alias": {
31-
"dev-master": "1.0.x-dev"
31+
"dev-master": "1.1.x-dev"
3232
}
3333
}
3434
}

src/Acl.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Mendo\Acl;
1313

14+
use Matcher\MatcherInterface;
15+
1416
/**
1517
* An ACL implementation.
1618
*
@@ -20,6 +22,7 @@ class Acl implements AclInterface
2022
{
2123
private $roles;
2224
private $rules = [];
25+
private $defaultResourceMatcher;
2326

2427
/**
2528
* @param Roles $roles
@@ -86,7 +89,7 @@ private function addRule($role, $resource, $privileges, $isAllowed)
8689
$role = $this->roles->get($role);
8790

8891
if (is_scalar($resource)) {
89-
$resource = new Resource($resource);
92+
$resource = new Resource($resource, $this->defaultResourceMatcher);
9093
} elseif (!$resource instanceof ResourceInterface) {
9194
throw new \InvalidArgumentException('$resource is expected to be of type string or Mendo\Acl\ResourceInterface');
9295
}
@@ -165,4 +168,21 @@ private function getRule($role, $resource, $privilege)
165168

166169
return null;
167170
}
171+
172+
/**
173+
* @param MatcherInterface|string $defaultResourceMatcher
174+
*
175+
* @throws \InvalidArgumentException
176+
*/
177+
public function setDefaultResourceMatcher($defaultResourceMatcher)
178+
{
179+
if (is_scalar($defaultResourceMatcher)) {
180+
$defaultResourceMatcher = 'Mendo\\Acl\\Matcher\\'.ucfirst($defaultResourceMatcher).'Matcher';
181+
$defaultResourceMatcher = new $defaultResourceMatcher();
182+
} elseif (!$resource instanceof MatcherInterface) {
183+
throw new \InvalidArgumentException('$defaultResourceMatcher is expected to be of type string or Mendo\Acl\Matcher\MatcherInterface');
184+
}
185+
186+
$this->defaultResourceMatcher = $defaultResourceMatcher;
187+
}
168188
}

src/Provider/Pimple/AclServiceProvider.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public function register(Container $container)
3535
'roles' => [],
3636
'resources' => [],
3737
];
38-
$container[$this->reference.'.defaultResourceType'] = 'default';
3938

4039
$container[$this->reference] = function ($c) {
4140
if (!empty($c[$this->reference.'.acl.roles'])) {
@@ -51,11 +50,11 @@ public function register(Container $container)
5150
}
5251

5352
$acl = new Acl($roles);
53+
if (!empty($c[$this->reference.'.defaultResourceMatcher'])) {
54+
$acl->setDefaultResourceMatcher($c[$this->reference.'.defaultResourceMatcher']);
55+
}
5456

5557
foreach ($c[$this->reference.'.definitions']['resources'] as $resource => $data) {
56-
$resourceType = !empty($data['type']) ? $data['type'] : $c[$this->reference.'.defaultResourceType'];
57-
$resourceMatcher = 'Mendo\\Acl\\Matcher\\'.ucfirst($resourceType).'Matcher';
58-
$resource = new Resource($resource, new $resourceMatcher());
5958
$rules = !empty($data['rules']) ? $data['rules'] : [];
6059
foreach ($rules as $rule) {
6160
if (empty($rule['role'])) {

tests/AclTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,20 @@ public function testMultipleAclOneSetOfRoles()
334334
$this->assertTrue($this->acl2->isAllowed('guest', 'bar', 'view'));
335335
$this->assertFalse($this->acl1->isAllowed('guest', 'bar', 'view'));
336336
}
337+
338+
public function testAclDefaultResourceMatcher()
339+
{
340+
$resource = new Resource('page/', new StartsWithMatcher());
341+
342+
$this->acl->addRole('guest');
343+
344+
$this->acl->setDefaultResourceMatcher('startsWith');
345+
346+
$this->acl->allow('guest', 'page/', '*');
347+
348+
$this->assertTrue($this->acl->isAllowed('guest', 'page/view/42'));
349+
$this->assertFalse($this->acl->isAllowed('guest', 'user/view/42'));
350+
}
337351
}
338352

339353
class MyCustomResource implements ResourceInterface

0 commit comments

Comments
 (0)