Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
75.00% covered (success)
75.00%
3 / 4
CRAP
91.67% covered (success)
91.67%
22 / 24
CheckRole
0.00% covered (danger)
0.00%
0 / 1
75.00% covered (success)
75.00%
3 / 4
12.08
91.67% covered (success)
91.67%
22 / 24
 handle
0.00% covered (danger)
0.00%
0 / 1
6.17
83.33% covered (success)
83.33%
10 / 12
 retrieveUserId
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
6 / 6
 check
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 isSystemCall
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
1<?php
2
3namespace Qmp\Laravel\Acls\Middleware;
4
5use Illuminate\Support\Facades\Log;
6use Qmp\Laravel\Acls\Facades\Role;
7use Illuminate\Http\Response;
8use Illuminate\Support\Facades\Request;
9use Qmp\Laravel\Acls\Client\Client as AclsClient;
10use Qmp\Laravel\Acls\Exceptions\RolePermissionException;
11use Qmp\Laravel\Acls\Facades\Permission;
12use Closure;
13use Qmp\Laravel\MicroService\Client\Client as ServiceClient;
14use \Qmp\Laravel\MicroService\Client\Tools\Request as ClientRequest;
15
16class CheckRole
17{
18    const ACLS_CONTAINER = 'service_acls';
19
20    const SERVICE_NAME_ACLS = 'service-acls-laravel';
21
22    const SERVICE_NAME_API_GATEWAY = 'service-api-gateway-laravel';
23
24    /**
25     * @param $request
26     * @param Closure $next
27     * @param $role
28     * @return $this|mixed
29     */
30    public function handle($request, Closure $next, $role, $all = false)
31    {
32        try {
33            if (!$this->isSystemCall($request)) {
34                if ($all !== false && $all === 'true') {
35                    $all = true;
36                }
37
38                $container = config('micro-services.name');
39                $userId = $this->retrieveUserId($request, $container);
40                $this->check($container, $userId, $role, $all);
41            }
42        } catch(RolePermissionException $e) {
43            Log::debug('check role refused:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
44            if (Request::is('api*')) {
45                return response()->json(['message' => $e->getMessage()])->setStatusCode(403);
46            }
47
48            return response(view('errors.403'), 403);
49        }
50
51        return $next($request);
52    }
53
54
55    private function retrieveUserId($request, $container)
56    {
57        $userId = $container === self::SERVICE_NAME_API_GATEWAY
58            ? $request->auth_user_id
59            : $request->header(ServiceClient::KEYWORD_HEADER_REQUEST);
60        if (!isset($userId)) {
61            throw new RolePermissionException('User is not setted !');
62        }
63
64        return $userId;
65    }
66
67    private function check($container, $userId, $role, $all)
68    {
69        if ($container === self::SERVICE_NAME_ACLS) {
70            Role::needed($userId, explode('|', $role), $all);
71        } else {
72            AclsClient::role($userId, explode('|', $role), $all);
73        }
74    }
75
76    private function isSystemCall($request)
77    {
78        $token = $request->header(ServiceClient::KEYWORD_HEADER_REQUEST_SYSTEM_CALL);
79
80        return $token === env('TOKEN_SYSTEM_CALL', '');
81    }
82}