Skip to content

Commit 98dd4c7

Browse files
committed
implements Api.Middleware configuration parameter
1 parent 12b92ee commit 98dd4c7

File tree

9 files changed

+189
-18
lines changed

9 files changed

+189
-18
lines changed

config/api.php

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
<?php
22
/**
3-
* Copyright 2016 - 2017, Cake Development Corporation (http://cakedc.com)
3+
* Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
44
*
55
* Licensed under The MIT License
66
* Redistributions of files must retain the above copyright notice.
77
*
8-
* @copyright Copyright 2016 - 2017, Cake Development Corporation (http://cakedc.com)
8+
* @copyright Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
99
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
1010
*/
11+
use Authentication\AuthenticationService;
12+
use Authentication\Middleware\AuthenticationMiddleware;
13+
use Authorization\Middleware\AuthorizationMiddleware;
14+
use Authorization\Middleware\RequestAuthorizationMiddleware;
15+
use CakeDC\Api\Middleware\ParseApiRequestMiddleware;
16+
use CakeDC\Api\Middleware\ProcessApiRequestMiddleware;
17+
use CakeDC\Api\ApiInitializer;
1118

1219
return [
1320
'Api' => [
@@ -31,6 +38,30 @@
3138
'default' => 'auth'
3239
],
3340
],
41+
42+
'Middleware' => [
43+
'authentication' => [
44+
'class' => AuthenticationMiddleware::class,
45+
'request' => ApiInitializer::class,
46+
'method' => 'getAuthenticationService',
47+
],
48+
'apiParser' => [
49+
'class' => ParseApiRequestMiddleware::class,
50+
],
51+
'apiAuthorize' => [
52+
'class' => AuthorizationMiddleware::class,
53+
'request' => ApiInitializer::class,
54+
'params' => [
55+
'unauthorizedHandler' => 'CakeDC/Api.ApiException',
56+
],
57+
],
58+
'apiAuthorizeRequest' => [
59+
'class' => RequestAuthorizationMiddleware::class,
60+
],
61+
'apiProcessor' => [
62+
'class' => ProcessApiRequestMiddleware::class,
63+
],
64+
],
3465

3566
'Service' => [
3667
'default' => [

config/api_permissions.php.default

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
return [
4+
'CakeDC/Auth.api_permissions' => [
5+
[
6+
'role' => '*',
7+
'service' => '*',
8+
'action' => '*',
9+
'method' => '*',
10+
'bypassAuth' => true,
11+
],
12+
]
13+
];

config/bootstrap.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<?php
22
/**
3-
* Copyright 2016 - 2017, Cake Development Corporation (http://cakedc.com)
3+
* Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
44
*
55
* Licensed under The MIT License
66
* Redistributions of files must retain the above copyright notice.
77
*
8-
* @copyright Copyright 2016 - 2017, Cake Development Corporation (http://cakedc.com)
8+
* @copyright Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
99
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
1010
*/
1111

config/routes.php

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
<?php
22
/**
3-
* Copyright 2016 - 2017, Cake Development Corporation (http://cakedc.com)
3+
* Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
44
*
55
* Licensed under The MIT License
66
* Redistributions of files must retain the above copyright notice.
77
*
8-
* @copyright Copyright 2016 - 2017, Cake Development Corporation (http://cakedc.com)
8+
* @copyright Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
99
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
1010
*/
1111

1212
use Cake\Core\Configure;
1313
use Cake\Routing\Router;
14+
use Cake\Routing\RouteBuilder;
1415

1516
Router::plugin('CakeDC/Api', ['path' => '/api'], function ($routes) {
1617
$useVersioning = Configure::read('Api.useVersioning');
1718
$versionPrefix = Configure::read('Api.versionPrefix');
19+
$middlewares = Configure::read('Api.Middleware');
20+
$middlewareNames = array_keys($middlewares);
21+
22+
$routes->applyMiddleware(...$middlewareNames);
23+
1824
if (empty($versionPrefix)) {
1925
$versionPrefix = 'v';
2026
}
@@ -29,11 +35,6 @@
2935
'controller' => 'Api',
3036
'action' => 'listing'
3137
], ['version' => $versionPrefix . '\d+', 'pass' => []]);
32-
$routes->connect('/:version/:service/*', [
33-
'plugin' => 'CakeDC/Api',
34-
'controller' => 'Api',
35-
'action' => 'process'
36-
], ['version' => $versionPrefix . '\d+', 'pass' => []]);
3738
}
3839
$routes->connect('/describe/*', [
3940
'plugin' => 'CakeDC/Api',
@@ -45,9 +46,5 @@
4546
'controller' => 'Api',
4647
'action' => 'listing'
4748
]);
48-
$routes->connect('/:service/*', [
49-
'plugin' => 'CakeDC/Api',
50-
'controller' => 'Api',
51-
'action' => 'process'
52-
]);
49+
$routes->connect('/**', ['plugin' => 'CakeDC/Api', 'controller' => 'Api', 'action' => 'notFound']);
5350
});

src/ApiInitializer.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
/**
5+
* Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
6+
*
7+
* Licensed under The MIT License
8+
* Redistributions of files must retain the above copyright notice.
9+
*
10+
* @copyright Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
11+
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
12+
*/
13+
14+
namespace CakeDC\Api;
15+
16+
use Authentication\AuthenticationService;
17+
use Authorization\AuthorizationService;
18+
use Authorization\AuthorizationServiceInterface;
19+
use Authorization\AuthorizationServiceProviderInterface;
20+
use Authorization\Policy\MapResolver;
21+
use Authorization\Policy\OrmResolver;
22+
use Authorization\Policy\ResolverCollection;
23+
use Cake\Core\Configure;
24+
use Cake\Http\ServerRequest;
25+
use CakeDC\Api\Rbac\ApiRbac;
26+
use CakeDC\Auth\Rbac\Rbac;
27+
use CakeDC\Auth\Policy\CollectionPolicy;
28+
use CakeDC\Auth\Policy\RbacPolicy;
29+
use CakeDC\Auth\Policy\SuperuserPolicy;
30+
use Psr\Http\Message\ResponseInterface;
31+
use Psr\Http\Message\ServerRequestInterface;
32+
33+
class ApiInitializer implements AuthorizationServiceProviderInterface
34+
{
35+
36+
public function getAuthenticationService(): AuthenticationService
37+
{
38+
$service = new AuthenticationService();
39+
$service->loadIdentifier('Authentication.JwtSubject', []);
40+
41+
$service->loadIdentifier('Authentication.Password', []);
42+
$service->loadAuthenticator('Authentication.Session', [
43+
'sessionKey' => 'Auth',
44+
]);
45+
46+
$service->loadIdentifier('Authentication.Token', [
47+
'dataField' => 'token',
48+
'tokenField' => 'api_token',
49+
]);
50+
$service->loadAuthenticator('Authentication.Token', [
51+
'queryParam' => 'token',
52+
]);
53+
54+
return $service;
55+
}
56+
57+
public function getAuthorizationService(ServerRequestInterface $request): AuthorizationServiceInterface
58+
{
59+
$map = new MapResolver();
60+
$rbac = new ApiRbac();
61+
$map->map(
62+
ServerRequest::class,
63+
new CollectionPolicy([
64+
//SuperuserPolicy::class,
65+
new RbacPolicy([
66+
'adapter' => $rbac
67+
])
68+
])
69+
);
70+
71+
$orm = new OrmResolver();
72+
73+
$resolver = new ResolverCollection([
74+
$map,
75+
$orm
76+
]);
77+
78+
return new AuthorizationService($resolver);
79+
}
80+
81+
}

src/Controller/ApiController.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,9 @@ protected function _process(array $options = []): ?Response
123123

124124
return $this->getResponse();
125125
}
126+
127+
public function notFound()
128+
{
129+
return $this->getResponse()->withStatus(404);
130+
}
126131
}

src/Plugin.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,56 @@
11
<?php
22
declare(strict_types=1);
33

4+
/**
5+
* Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
6+
*
7+
* Licensed under The MIT License
8+
* Redistributions of files must retain the above copyright notice.
9+
*
10+
* @copyright Copyright 2016 - 2019, Cake Development Corporation (http://cakedc.com)
11+
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
12+
*/
13+
414
namespace CakeDC\Api;
515

16+
use Authentication\AuthenticationService;
17+
use Authentication\Middleware\AuthenticationMiddleware;
18+
use Authorization\Middleware\AuthorizationMiddleware;
19+
use Authorization\Middleware\RequestAuthorizationMiddleware;
20+
use CakeDC\Api\Middleware\ParseApiRequestMiddleware;
21+
use CakeDC\Api\Middleware\ProcessApiRequestMiddleware;
622
use Cake\Core\BasePlugin;
23+
use Cake\Core\Configure;
724

825
/**
926
* Api plugin
1027
*/
1128
class Plugin extends BasePlugin
1229
{
30+
31+
public function routes($routes): void
32+
{
33+
$middlewares = Configure::read('Api.Middleware');
34+
foreach ($middlewares as $alias => $middleware) {
35+
$class = $middleware['class'];
36+
if (array_key_exists('request', $middleware)) {
37+
$requestClass = $middleware['request'];
38+
$request = new $requestClass();
39+
if (array_key_exists('method', $middleware)) {
40+
$request = $request->{$middleware['method']}();
41+
}
42+
if (array_key_exists('params', $middleware)) {
43+
$options = $middleware['params'];
44+
$routes->registerMiddleware($alias, new $class($request, $options));
45+
} else {
46+
$routes->registerMiddleware($alias, new $class($request));
47+
}
48+
} else {
49+
$routes->registerMiddleware($alias, new $class());
50+
}
51+
}
52+
53+
parent::routes($routes);
54+
}
55+
1356
}

src/Rbac/ApiRbac.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Cake\Utility\Inflector;
2121
use CakeDC\Api\Rbac\Permissions\AbstractProvider;
2222
use CakeDC\Auth\Rbac\PermissionMatchResult;
23+
use CakeDC\Auth\Rbac\RbacInterface;
2324
use CakeDC\Auth\Rbac\Rules\Rule;
2425
use Psr\Http\Message\ServerRequestInterface;
2526
use Psr\Log\LogLevel;
@@ -29,7 +30,7 @@
2930
*
3031
* @package Rbac
3132
*/
32-
class ApiRbac
33+
class ApiRbac implements RbacInterface
3334
{
3435
use InstanceConfigTrait;
3536
use LogTrait;

src/Service/Service.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,7 @@ protected function _initializeParser(array $config): void
966966
}
967967

968968
$class = App::className($this->_parserClass, 'Service/RequestParser', 'Parser');
969-
if (!class_exists($class)) {
969+
if ($class === null || !class_exists($class)) {
970970
throw new MissingParserException(['class' => $this->_parserClass]);
971971
}
972972
$this->_parser = new $class($this);

0 commit comments

Comments
 (0)