AuthenticationMiddleware::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 7
c 2
b 0
f 0
dl 0
loc 11
ccs 0
cts 3
cp 0
rs 10
cc 1
nc 1
nop 1
crap 2
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