AccessControl   A
last analyzed

Complexity

Total Complexity 21

Size/Duplication

Total Lines 134
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 21
eloc 42
c 4
b 0
f 0
dl 0
loc 134
ccs 42
cts 42
cp 1
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A hasUserAccessToRoute() 0 9 3
A __construct() 0 10 1
A isEnable() 0 3 1
A getAllSecuredRoutes() 0 10 3
A hasUserAccessToRoutes() 0 9 3
A hasUserAccessAtLeastOneRoute() 0 9 3
B isRouteSecure() 0 23 7
1
<?php
2
/**
3
 * User: Simon Libaud
4
 * Date: 19/03/2017
5
 * Email: [email protected].
6
 */
7
namespace Sil\RouteSecurityBundle\Security;
8
9
use Sil\RouteSecurityBundle\Exception\LogicException;
10
use Sil\RouteSecurityBundle\Interfaces\NamingStrategyInterface;
11
use Symfony\Component\Routing\RouterInterface;
12
use Symfony\Component\Security\Core\User\UserInterface;
13
14
/**
15
 * Class AccessControl.
16
 */
17
class AccessControl
18
{
19
    private $router;
20
    private $routeToRoleConverter;
21
    private $is_access_control_enable;
22
    private $secured_routes;
23
    private $secured_routes_format;
24
    private $ignored_routes;
25
    private $ignored_routes_format;
26
27 9
    public function __construct(RouterInterface $router, NamingStrategyInterface $routeToRoleConverter, $configuration)
28
    {
29 9
        $this->router = $router;
30 9
        $this->routeToRoleConverter = $routeToRoleConverter;
31
32 9
        $this->is_access_control_enable = $configuration['enable_access_control'];
33 9
        $this->secured_routes = $configuration['secured_routes'];
34 9
        $this->secured_routes_format = $configuration['secured_routes_format'];
35 9
        $this->ignored_routes = $configuration['ignored_routes'];
36 9
        $this->ignored_routes_format = $configuration['ignored_routes_format'];
37 9
    }
38
39
    /**
40
     * Verify if  user has access to a specific route.
41
     *
42
     * @param UserInterface $user
43
     * @param string        $route
44
     *
45
     * @return bool
46
     */
47 5
    public function hasUserAccessToRoute(UserInterface $user, $route)
48
    {
49 5
        if (false === $this->is_access_control_enable || false === $this->isRouteSecure($route)) {
50 3
            return true;
51
        }
52
53 5
        $role = $this->routeToRoleConverter->generateRoleForRoute($route);
54
55 5
        return in_array($role, $user->getRoles());
56
    }
57
58
    /**
59
     * Verify if user has access to all routes.
60
     *
61
     * @param UserInterface $user
62
     * @param array         $routes
63
     *
64
     * @return bool
65
     */
66 1
    public function hasUserAccessToRoutes(UserInterface $user, $routes)
67
    {
68 1
        foreach ($routes as $route) {
69 1
            if (false === $this->hasUserAccessToRoute($user, $route)) {
70 1
                return false;
71
            }
72
        }
73
74 1
        return true;
75
    }
76
77
    /**
78
     * Verify if user has access to one of routes.
79
     *
80
     * @param UserInterface $user
81
     * @param $routes
82
     *
83
     * @return bool
84
     */
85 1
    public function hasUserAccessAtLeastOneRoute(UserInterface $user, $routes)
86
    {
87 1
        foreach ($routes as $route) {
88 1
            if (true === $this->hasUserAccessToRoute($user, $route)) {
89 1
                return true;
90
            }
91
        }
92
93 1
        return false;
94
    }
95
96
    /**
97
     * Check if the given route is manage by the bundle depending of the configuration.
98
     *
99
     * @param string $route
100
     *
101
     * @return bool
102
     */
103 8
    public function isRouteSecure($route)
104
    {
105
        // Ignored routes
106 8
        if (true === in_array($route, $this->ignored_routes)) {
107 5
            return false;
108
        }
109
110
        // Ignored routes format
111 8
        if (null !== $this->ignored_routes_format && 1 === preg_match($this->ignored_routes_format, $route)) {
112 2
            return false;
113
        }
114
115
        // Secured routes
116 8
        if (true === in_array($route, $this->secured_routes)) {
117 7
            return true;
118
        }
119
120
        // Secured routes format
121 7
        if (null !== $this->secured_routes_format && 1 === preg_match($this->secured_routes_format, $route)) {
122 4
            return true;
123
        }
124
125 4
        return false;
126
    }
127
128
    /**
129
     * Return all secured routes manage by the bundle
130
     *
131
     * @return array
132
     */
133 3
    public function getAllSecuredRoutes()
134
    {
135 3
        $all_secured_routes = [];
136 3
        $configured_routes = array_keys($this->router->getRouteCollection()->all());
137
138 3
        foreach ($configured_routes as $configured_route) if (true === $this->isRouteSecure($configured_route)){
139 3
            $all_secured_routes[] = $configured_route;
140
        }
141
142 3
        return $all_secured_routes;
143
    }
144
145
    /**
146
     * @return bool
147
     */
148 4
    public function isEnable()
149
    {
150 4
        return $this->is_access_control_enable;
151
    }
152
}
153