Passed
Push — main ( 3b40c1...b711d3 )
by Peter
07:24
created

EnforcerBootstrapper::createModel()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 5
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Framework\Bootstrappers\Authorization;
6
7
use AbterPhp\Framework\Authorization\CacheManager;
8
use AbterPhp\Framework\Authorization\CombinedAdapter;
9
use AbterPhp\Framework\Authorization\Constant\Role;
10
use AbterPhp\Framework\Constant\Env;
11
use AbterPhp\Framework\Constant\Session;
12
use Casbin\Enforcer;
13
use Casbin\Exceptions\CasbinException;
14
use Opulence\Environments\Environment;
15
use Opulence\Ioc\Bootstrappers\Bootstrapper;
16
use Opulence\Ioc\Bootstrappers\ILazyBootstrapper;
17
use Opulence\Ioc\IContainer;
18
use Opulence\Ioc\IocException;
19
use Opulence\Sessions\ISession;
20
use Opulence\Views\Compilers\Fortune\ITranspiler;
21
22
class EnforcerBootstrapper extends Bootstrapper implements ILazyBootstrapper
23
{
24
    /**
25
     * @return array
26
     */
27
    public function getBindings(): array
28
    {
29
        return [
30
            Enforcer::class,
31
        ];
32
    }
33
34
    /**
35
     * @param IContainer $container
36
     *
37
     * @throws CasbinException
38
     * @throws IocException
39
     */
40
    public function registerBindings(IContainer $container)
41
    {
42
        /** @var CacheManager $cacheManager */
43
        $combinedAdapter = $container->resolve(CombinedAdapter::class);
44
45
        $modelPath = sprintf("%s/model.conf", Environment::getVar(Env::DIR_AUTH_CONFIG));
46
        $enforcer  = new Enforcer($modelPath, $combinedAdapter);
47
48
        $enforcer->loadPolicy();
49
50
        $container->bindInstance(Enforcer::class, $enforcer);
51
52
        $this->registerViewFunction($container, $enforcer);
53
    }
54
55
    /**
56
     * @param IContainer $container
57
     * @param Enforcer   $enforcer
58
     *
59
     * @throws IocException
60
     */
61
    private function registerViewFunction(IContainer $container, Enforcer $enforcer)
62
    {
63
        if (!$container->hasBinding(ISession::class)) {
64
            return;
65
        }
66
67
        /** @var ISession $session */
68
        $session  = $container->resolve(ISession::class);
69
        $username = $session->get(Session::USERNAME);
70
71
        /** @var ITranspiler $transpiler */
72
        $transpiler = $container->resolve(ITranspiler::class);
73
        $transpiler->registerViewFunction(
74
            'canView',
75
            function (string $key) use ($username, $enforcer) {
76
                return $enforcer->enforce($username, 'admin_resource_' . $key, Role::READ);
77
            }
78
        );
79
    }
80
}
81