Skip to content

Commit 10e3bfb

Browse files
committed
Fix up authorization plugin support
1 parent 7a43d21 commit 10e3bfb

File tree

4 files changed

+78
-10
lines changed

4 files changed

+78
-10
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
"cakephp/debug_kit": "^5.0.1",
3333
"composer/semver": "^3.0",
3434
"fig-r/psr2r-sniffer": "dev-master",
35-
"phpunit/phpunit": "^10.2"
35+
"phpunit/phpunit": "^10.2",
36+
"slevomat/coding-standard": "~8.15.0"
3637
},
3738
"minimum-stability": "stable",
3839
"prefer-stable": true,

docs/AuthorizationPlugin.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,19 @@ use Authorization\Middleware\AuthorizationMiddleware;
1818
use TinyAuth\Middleware\RequestAuthorizationMiddleware;
1919

2020
// in Application::middleware()
21-
$config = [
21+
$middlewareQueue->add(new AuthorizationMiddleware($this, [
2222
'unauthorizedHandler' => [
2323
'className' => 'Authorization.Redirect',
24-
...
24+
'url' => '...',
2525
],
26-
];
27-
$middlewareQueue->add(new AuthorizationMiddleware($this, $config));
28-
$middlewareQueue->add(new RequestAuthorizationMiddleware());
26+
]));
27+
$middlewareQueue->add(new RequestAuthorizationMiddleware([
28+
'unauthorizedHandler' => [
29+
'className' => 'TinyAuth.Redirect',
30+
'url' => '...',
31+
'unauthorizedMessage' => '...',
32+
],
33+
])));
2934
```
3035

3136
For all the rest just follow the plugin's documentation.

src/Middleware/RequestAuthorizationMiddleware.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace TinyAuth\Middleware;
44

5+
use Authorization\Exception\Exception;
56
use Authorization\Exception\ForbiddenException;
67
use Authorization\Middleware\RequestAuthorizationMiddleware as PluginRequestAuthorizationMiddleware;
78
use Authorization\Policy\Result;
@@ -30,7 +31,7 @@ class RequestAuthorizationMiddleware extends PluginRequestAuthorizationMiddlewar
3031
/**
3132
* @param array $config Configuration options
3233
*/
33-
public function __construct($config = []) {
34+
public function __construct(array $config = []) {
3435
$config += Config::all();
3536

3637
parent::__construct($config);
@@ -56,10 +57,14 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
5657
$identity = $request->getAttribute($this->getConfig('identityAttribute'));
5758

5859
$can = $service->can($identity, $this->getConfig('method'), $request);
59-
if (!$can) {
60-
$result = new Result($can, 'Can not ' . $this->getConfig('method') . ' request');
60+
try {
61+
if (!$can) {
62+
$result = new Result($can, 'Can not ' . $this->getConfig('method') . ' request');
6163

62-
throw new ForbiddenException($result);
64+
throw new ForbiddenException($result);
65+
}
66+
} catch (Exception $exception) {
67+
return $this->handleException($exception, $request, $this->getConfig('unauthorizedHandler'));
6368
}
6469

6570
return $handler->handle($request);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace TinyAuth\Middleware\UnauthorizedHandler;
5+
6+
use Authorization\Exception\Exception;
7+
use Authorization\Exception\ForbiddenException;
8+
use Authorization\Exception\MissingIdentityException;
9+
use Authorization\Middleware\UnauthorizedHandler\RedirectHandler as CakeRedirectHandler;
10+
use Psr\Http\Message\ResponseInterface;
11+
use Psr\Http\Message\ServerRequestInterface;
12+
13+
/**
14+
* This handler will redirect the response if one of configured exception classes is encountered.
15+
*/
16+
class RedirectHandler extends CakeRedirectHandler {
17+
18+
/**
19+
* Default config:
20+
*
21+
* - `exceptions` - A list of exception classes.
22+
* - `url` - Url to redirect to.
23+
* - `queryParam` - Query parameter name for the target url.
24+
* - `statusCode` - Redirection status code.
25+
*
26+
* @var array<string, mixed>
27+
*/
28+
protected array $defaultOptions = [
29+
'exceptions' => [
30+
MissingIdentityException::class,
31+
ForbiddenException::class,
32+
],
33+
'url' => '/login',
34+
'queryParam' => 'redirect',
35+
'statusCode' => 302,
36+
'unauthorizedMessage' => null,
37+
];
38+
39+
/**
40+
* @param \Authorization\Exception\Exception $exception
41+
* @param \Psr\Http\Message\ServerRequestInterface $request
42+
* @param array<string, mixed> $options
43+
* @return \Psr\Http\Message\ResponseInterface
44+
*/
45+
public function handle(Exception $exception, ServerRequestInterface $request, array $options = []): ResponseInterface {
46+
$response = parent::handle($exception, $request, $options);
47+
48+
$message = $options['unauthorizedMessage'] ?? __('You are not authorized to access that location');
49+
if ($message) {
50+
/** @var \Cake\Http\ServerRequest $request */
51+
$request->getFlash()->error($message);
52+
}
53+
54+
return $response;
55+
}
56+
57+
}

0 commit comments

Comments
 (0)