Skip to content

Commit 577cf20

Browse files
committed
Added voter
1 parent f3100fb commit 577cf20

File tree

5 files changed

+113
-37
lines changed

5 files changed

+113
-37
lines changed

config/services.yaml

+7-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@ services:
99

1010
Ggbb\SymfonyUserPermission\EventListener\RequestSubscriber:
1111

12+
ggbb.user_permission.mapping:
13+
class: Ggbb\SymfonyUserPermission\PermissionMapping\PermissionMapping
14+
1215
ggbb.user_permission.user_service:
1316
class: Ggbb\SymfonyUserPermission\Service\PermissionService
17+
arguments:
18+
-
1419
autowire: true
1520
autoconfigure: true
1621

@@ -22,5 +27,6 @@ services:
2227
class: Ggbb\SymfonyUserPermission\Security\Voter\PermissionVoter
2328
tags: ['security.voter']
2429
arguments:
25-
- ggbb.user_permission.user_service
30+
- '@ggbb.user_permission.user_service'
2631
autowire: true
32+
autoconfigure: true

src/GgbbUserPermissionBundle.php

+21-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
namespace Ggbb\SymfonyUserPermission;
44

5-
use Ggbb\SymfonyUserPermission\Service\PermissionService;
5+
use Ggbb\SymfonyUserPermission\Permission\PermissionMappingGenerator;
66
use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
77
use Symfony\Component\DependencyInjection\ContainerBuilder;
88
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
99
use Symfony\Component\HttpKernel\Bundle\AbstractBundle;
10-
use Symfony\Contracts\Cache\TagAwareCacheInterface;
1110

1211
class GgbbUserPermissionBundle extends AbstractBundle
1312
{
@@ -24,6 +23,12 @@ public function configure(DefinitionConfigurator $definition): void
2423
->scalarNode('user_role')->end()
2524
->end()
2625
->end()
26+
->arrayNode('mapping')
27+
->children()
28+
->scalarNode('permissions_dir')->end()
29+
->scalarNode('namespace')->end()
30+
->end()
31+
->end()
2732
->end();
2833
}
2934

@@ -33,7 +38,20 @@ public function loadExtension(array $config, ContainerConfigurator $containerCon
3338

3439
$containerConfigurator->parameters()->set(self::CONFIG_USER, $config['entity']['user']);
3540
$containerConfigurator->parameters()->set(self::CONFIG_USER_ROLE, $config['entity']['user_role']);
36-
$containerBuilder->setDefinitions();
41+
42+
43+
$definition = $containerBuilder->getDefinition('ggbb.user_permission.user_service');
44+
$definition->setArgument('$permissionMapping', PermissionMappingGenerator::generating($config['mapping']['namespace'], $config['mapping']['permissions_dir']));
45+
46+
// $resv = $containerConfigurator->services()->get('ggbb.user_permission.user_service')
47+
// ->arg(0, '111111111111');
48+
///dd($resv);
49+
// ->get('ggbb.user_permission.user_service')
50+
// ->set()
51+
// ->arg(0, '1111')
52+
// ->arg(1, '2222');
53+
;
54+
// $containerBuilder->setDefinitions();
3755
// dump('Test');
3856
// /** @var PermissionService $res */
3957
// $res = $containerBuilder->get('ggbb.user_permission.user_service');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Ggbb\SymfonyUserPermission\Permission;
4+
5+
final class PermissionMappingGenerator
6+
{
7+
public static function generating(string $namespace, string $permissionsDirPath, ?string $middleDirPath = null): array
8+
{
9+
$files = [];
10+
/** @var \SplFileInfo $file */
11+
foreach (new \DirectoryIterator($permissionsDirPath) as $file) {
12+
// dump($file);
13+
if ($file->isFile()) {
14+
$typeFile = substr($file->getFilename(), -4);
15+
if ($typeFile !== '.php') {
16+
continue;
17+
}
18+
19+
$middleDirNamespace = '';
20+
if ($middleDirPath) {
21+
$middleDirNamespace = str_replace('/', '\\', $middleDirPath);
22+
}
23+
24+
$fileName = substr($file->getFilename(), 0, -4);
25+
$files[$fileName] = "{$namespace}{$middleDirNamespace}\\{$fileName}";
26+
}
27+
if ($file->isDir()) {
28+
if ($file->getRealPath() === $permissionsDirPath || in_array($file->getFilename(), ['..', '.'])) {
29+
continue;
30+
}
31+
32+
$middleDirName = str_replace($permissionsDirPath, '', $file->getRealPath());
33+
$files = array_merge($files, self::generating($namespace, $file->getRealPath(), "{$middleDirPath}{$middleDirName}"));
34+
}
35+
}
36+
return $files;
37+
}
38+
}

src/Security/Voter/PermissionVoter.php

+17-28
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,39 @@
22

33
namespace Ggbb\SymfonyUserPermission\Security\Voter;
44

5+
use Ggbb\SymfonyUserPermission\Entity\Interface\UserRoleFieldInterface;
56
use Ggbb\SymfonyUserPermission\Service\PermissionService;
7+
use Symfony\Bundle\SecurityBundle\Security;
68
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
79
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
8-
use Symfony\Contracts\Cache\TagAwareCacheInterface;
910

1011
class PermissionVoter extends Voter
1112
{
1213
public function __construct(
14+
private readonly PermissionService $permissionService,
15+
private readonly Security $security,
1316
)
1417
{
1518
}
1619
protected function supports($attribute, $subject): bool
1720
{
21+
if (!$this->permissionService->hisPermission($attribute) || !$this->security->getUser()) {
22+
return false;
23+
}
1824

19-
20-
dump('1 Test - '. $attribute);
21-
return false;
22-
23-
dump('1');
24-
return true;
25-
dump('Start');
26-
27-
28-
//$res = $this->permissionService->isPermission($attribute);
29-
30-
dump($res);
31-
32-
33-
34-
35-
36-
37-
38-
39-
40-
dd('End');
41-
42-
// $pieces = explode("::", $attribute);
43-
44-
25+
return true;
4526
}
4627

4728
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
4829
{
49-
return false;
30+
/** @var UserRoleFieldInterface $user */
31+
$user = $this->security->getUser();
32+
$userRole = $user->getUserRole();
33+
34+
if (!in_array($attribute, $userRole->getPermissions())) {
35+
return false;
36+
}
37+
38+
return true;
5039
}
5140
}

src/Service/PermissionService.php

+30-5
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,45 @@
22

33
namespace Ggbb\SymfonyUserPermission\Service;
44

5+
56
class PermissionService
67
{
7-
public function isPermission(string $attribute): bool {
8-
if (!$attribute) {
8+
public function __construct(
9+
private readonly array $permissionMapping,
10+
)
11+
{
12+
}
13+
14+
public function hisPermission(string $attribute): bool
15+
{
16+
if (!$attribute || count($this->getExplodeNamePermission($attribute)) === 0) {
917
return false;
1018
}
1119

12-
$attributeParts = explode("::", $attribute);
13-
if (count($attributeParts) !== 2) {
20+
return true;
21+
}
22+
23+
public function isPermission(string $attribute): bool
24+
{
25+
if (!$this->hisPermission($attribute)) {
1426
return false;
1527
}
1628

17-
29+
$namePermission = $this->getExplodeNamePermission($attribute);
30+
if (!isset($this->permissionMapping[$namePermission[0]])) {
31+
return false;
32+
}
1833

1934
return true;
2035
}
36+
37+
private function getExplodeNamePermission($attribute): array
38+
{
39+
$attributeParts = explode("::", $attribute);
40+
if (count($attributeParts) !== 2) {
41+
return [];
42+
}
43+
44+
return $attributeParts;
45+
}
2146
}

0 commit comments

Comments
 (0)