Skip to content

Commit bc0e956

Browse files
authored
Merge pull request #267 from cakephp/2.next-service-di
2.next: add authorization service to DIC by default
2 parents 94fadea + 868e3e5 commit bc0e956

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"type": "cakephp-plugin",
1111
"require": {
1212
"php": ">=7.2",
13-
"cakephp/http": "^4.0",
13+
"cakephp/http": "^4.2",
1414
"psr/http-client": "^1.0",
1515
"psr/http-message": "^1.0",
1616
"psr/http-server-handler": "^1.0",

src/Middleware/AuthorizationMiddleware.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
namespace Authorization\Middleware;
1818

1919
use Authentication\IdentityInterface as AuthenIdentityInterface;
20+
use Authorization\AuthorizationService;
2021
use Authorization\AuthorizationServiceInterface;
2122
use Authorization\AuthorizationServiceProviderInterface;
2223
use Authorization\Exception\AuthorizationRequiredException;
@@ -25,6 +26,7 @@
2526
use Authorization\IdentityDecorator;
2627
use Authorization\IdentityInterface;
2728
use Authorization\Middleware\UnauthorizedHandler\UnauthorizedHandlerTrait;
29+
use Cake\Core\ContainerApplicationInterface;
2830
use Cake\Core\InstanceConfigTrait;
2931
use InvalidArgumentException;
3032
use Psr\Http\Message\ResponseInterface;
@@ -117,6 +119,11 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
117119
$service = $this->getAuthorizationService($request);
118120
$request = $request->withAttribute('authorization', $service);
119121

122+
if ($this->subject instanceof ContainerApplicationInterface) {
123+
$container = $this->subject->getContainer();
124+
$container->add(AuthorizationService::class, $service);
125+
}
126+
120127
$attribute = $this->getConfig('identityAttribute');
121128
$identity = $request->getAttribute($attribute);
122129

tests/TestCase/Middleware/AuthorizationMiddlewareTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
namespace Authorization\Test\TestCase\Middleware;
1818

19+
use Authorization\AuthorizationService;
1920
use Authorization\AuthorizationServiceInterface;
2021
use Authorization\AuthorizationServiceProviderInterface;
2122
use Authorization\Exception\AuthorizationRequiredException;
@@ -25,13 +26,15 @@
2526
use Authorization\Middleware\AuthorizationMiddleware;
2627
use Cake\Http\Response;
2728
use Cake\Http\ServerRequest;
29+
use Cake\Http\ServerRequestFactory;
2830
use Cake\TestSuite\TestCase;
2931
use InvalidArgumentException;
3032
use Psr\Http\Message\RequestInterface;
3133
use Psr\Http\Message\ResponseInterface;
3234
use Psr\Http\Message\ServerRequestInterface;
3335
use RuntimeException;
3436
use stdClass;
37+
use TestApp\Application;
3538
use TestApp\Http\TestRequestHandler;
3639
use TestApp\Identity;
3740

@@ -282,4 +285,21 @@ public function testUnauthorizedHandlerRequireAuthz()
282285
$result = $middleware->process($request, $handler);
283286
$this->assertSame(200, $result->getStatusCode());
284287
}
288+
289+
public function testMiddlewareInjectsServiceIntoDIC()
290+
{
291+
$request = ServerRequestFactory::fromGlobals(
292+
['REQUEST_URI' => '/testpath'],
293+
[],
294+
['username' => 'mariano', 'password' => 'password']
295+
);
296+
$handler = new TestRequestHandler();
297+
$application = new Application('config');
298+
299+
$middleware = new AuthorizationMiddleware($application, ['requireAuthorizationCheck' => false]);
300+
$middleware->process($request, $handler);
301+
302+
$container = $application->getContainer();
303+
$this->assertInstanceOf(AuthorizationService::class, $container->get(AuthorizationService::class));
304+
}
285305
}

tests/test_app/TestApp/Application.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@
33

44
namespace TestApp;
55

6+
use Authorization\AuthorizationService;
7+
use Authorization\AuthorizationServiceInterface;
8+
use Authorization\AuthorizationServiceProviderInterface;
9+
use Authorization\Policy\MapResolver;
610
use Cake\Http\BaseApplication;
711
use Cake\Http\MiddlewareQueue;
812
use Cake\Routing\RouteBuilder;
13+
use Psr\Http\Message\ServerRequestInterface;
14+
use TestApp\Model\Entity\Article;
15+
use TestApp\Policy\ArticlePolicy;
916

10-
class Application extends BaseApplication
17+
class Application extends BaseApplication implements AuthorizationServiceProviderInterface
1118
{
1219
public function middleware(MiddlewareQueue $middleware): MiddlewareQueue
1320
{
@@ -23,4 +30,13 @@ public function bootstrap(): void
2330
$this->addPlugin('Authorization');
2431
$this->addPlugin('Bake');
2532
}
33+
34+
public function getAuthorizationService(ServerRequestInterface $request): AuthorizationServiceInterface
35+
{
36+
$resolver = new MapResolver([
37+
Article::class => ArticlePolicy::class,
38+
]);
39+
40+
return new AuthorizationService($resolver);
41+
}
2642
}

0 commit comments

Comments
 (0)