AuthenticationMiddleware   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 45
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 5
eloc 19
c 3
b 0
f 0
dl 0
loc 45
ccs 0
cts 11
cp 0
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 1
A __invoke() 0 17 4
1
<?php
2
3
namespace App\Security\Middleware;
4
5
use App\Facades\Router;
6
use App\Facades\Security;
7
use App\Facades\Session;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Ronanchilvers\Foundation\Traits\Optionable;
10
use Slim\Http\Response;
11
12
/**
13
 * Authentication middleware responsible for managing access to protected routes
14
 *
15
 * @author Ronan Chilvers <[email protected]>
16
 */
17
class AuthenticationMiddleware
18
{
19
    use Optionable;
20
21
    /**
22
     * @var array
23
     */
24
    protected $anonymousRoutes = [];
25
26
    /**
27
     * Class constructor
28
     *
29
     * @param array $anonymouseRoutes
30
     * @author Ronan Chilvers <[email protected]>
31
     */
32
    public function __construct($options = [])
33
    {
34
        $this->setDefaults([
35
            'anonymous_routes' => [
36
                'user.login',
37
                'project.webhook',
38
            ],
39
            'login_route'    => 'user.login',
40
            'store_redirect' => true,
41
        ]);
42
        $this->setOptions($options);
43
    }
44
45
    public function __invoke(ServerRequestInterface $request, Response $response, $next)
46
    {
47
        $anonymousRoutes = $this->getOption('anonymous_routes', []);
48
        if (is_null($request->getAttribute('route'))) {
49
            return $response->withRedirect(
50
                Router::pathFor($this->getOption('login_route'))
51
            );
52
        }
53
        if (!in_array($request->getAttribute('route')->getName(), $anonymousRoutes)) {
54
            if (!Security::hasLogin()) {
55
                return $response->withRedirect(
56
                    Router::pathFor($this->getOption('login_route'))
57
                );
58
            }
59
        }
60
61
        return $next($request, $response);
62
    }
63
}
64