承認はミドルウェアとしてアプリケーションに適用されます。 AuthorizationMiddleware
は、次の役割を処理します:
can
、canResult
、applyScope
メソッドを追加するデコレーターでリクエストの「アイデンティティ」を装飾します。ミドルウェアを使用するには、アプリケーションクラスにAuthorizationServiceProviderInterface
を実装します。次に、アプリインスタンスをミドルウェアに渡し、ミドルウェアをキューに追加します。
基本的な例は次のとおりです:
namespace App;
use Authorization\AuthorizationService;
use Authorization\AuthorizationServiceProviderInterface;
use Authorization\Middleware\AuthorizationMiddleware;
use Authorization\Policy\OrmResolver;
use Cake\Http\BaseApplication;
class Application extends BaseApplication implements AuthorizationServiceProviderInterface
{
public function getAuthorizationService(ServerRequestInterface $request, ResponseInterface $response)
{
$resolver = new OrmResolver();
return new AuthorizationService($resolver);
}
public function middleware($middlewareQueue)
{
// other middleware
$middlewareQueue->add(new AuthorizationMiddleware($this));
return $middlewareQueue;
}
}
認可サービスには、ポリシーリゾルバが必要です。利用可能なリゾルバとその使用方法については、ポリシーのドキュメントを参照してください。
デフォルトでは、リクエストのID
はAuthorization\IdentityDecorator
で装飾(ラップ)されます。デコレータクラスのプロキシメソッドの呼び出し、装飾されたIDオブジェクトへの配列アクセスとプロパティアクセス。基になるIDに直接アクセスするには、getOriginalData()
を使用します:
$originalUser = $user->getOriginalData();
アプリケーションがcakephp/authenticationプラグインを使用している場合、Authorization\Identity
クラスが使用されます。このクラスは、Authorization\IdentityInterface
に加えて、Authentication\IdentityInterface
を実装します。これにより、認証
ライブラリのコンポーネントとヘルパーを使用して、装飾されたIDを取得できます。
既存のユーザー
またはIDクラスがある場合は、Authorization\IdentityInterface
を実装し、identityDecorator
ミドルウェアオプションを使用して、デコレーターをスキップできます。
まず、ユーザー
クラスを更新します:
namespace App\Model\Entity;
use Authorization\AuthorizationServiceInterface;
use Authorization\IdentityInterface;
use Authorization\Policy\ResultInterface;
use Cake\ORM\Entity;
class User extends Entity implements IdentityInterface
{
/**
* Authorization\IdentityInterface method
*/
public function can($action, $resource)
{
return $this->authorization->can($this, $action, $resource);
}
/**
* Authorization\IdentityInterface method
*/
public function canResult($action, $resource): ResultInterface
{
return $this->authorization->canResult($this, $action, $resource);
}
/**
* Authorization\IdentityInterface method
*/
public function applyScope($action, $resource)
{
return $this->authorization->applyScope($this, $action, $resource);
}
/**
* Authorization\IdentityInterface method
*/
public function getOriginalData()
{
return $this;
}
/**
* Setter to be used by the middleware.
*/
public function setAuthorization(AuthorizationServiceInterface $service)
{
$this->authorization = $service;
return $this;
}
// Other methods
}
ユーザーが必要なインターフェースを実装したので、ミドルウェアのセットアップを更新します:
// In your Application::middleware() method;
// Authorization
$middlewareQueue->add(new AuthorizationMiddleware($this, [
'identityDecorator' => function ($auth, $user) {
return $user->setAuthorization($auth);
}
]));
既存のタイプヒントを変更する必要がなくなり、ユーザーにアクセスできる場所であればどこでも承認ポリシーの使用を開始できます。
デフォルトでは、AuthorizationMiddleware
は、ID
を含む各リクエストにも承認がチェック/バイパスされていることを確認します。
承認がチェックされていない場合、AuthorizationRequiredException
が発生します。
この例外は、他のミドルウェア/コントローラーのアクションが完了した後に発生するため、不正アクセスを防止するためにこれに依存することはできませんが、開発/テスト中は役立ちます。
この動作はオプションで無効にできます:
$middlewareQueue->add(new AuthorizationMiddleware($this, [
'requireAuthorizationCheck' => false
]));
デフォルトでは、アプリケーションによってスローされた許可例外は、ミドルウェアによって再スローされます。不正なリクエストのハンドラーを構成し、カスタムアクションを実行できます。
例:ユーザーをログインページにリダイレクトします。
組み込みハンドラは次のとおりです:
Exception
- このハンドラーは例外を再スローします。これはミドルウェアのデフォルトの動作です。Redirect
- このハンドラーは、指定されたURLにリクエストをリダイレクトします。CakeRedirect
- CakePHPルーターをサポートするハンドラーをリダイレクトします。両方のリダイレクトハンドラーは同じ構成オプションを共有します:
url
- リダイレクト先のURL(CakeRedirect
はCakePHPルーター構文をサポートしています)。exceptions
- リダイレクトする必要がある例外クラスのリスト。 デフォルトでは、MissingIdentityException
のみがリダイレクトされます。queryParam
- アクセスされたリクエストURLは、リダイレクトURLクエリパラメータ(デフォルトではredirect
)にアタッチされます。statusCode
- リダイレクトのHTTPステータスコード。デフォルトは302
。例:
$middlewareQueue->add(new AuthorizationMiddleware($this, [
'unauthorizedHandler' => [
'className' => 'Authorization.Redirect',
'url' => '/users/login',
'queryParam' => 'redirectUrl',
'exceptions' => [
MissingIdentityException::class,
OtherException::class,
],
],
]));
独自のハンドラーを追加することもできます。ハンドラーはAuthorization\Middleware\UnauthorizedHandler\HandlerInterface
を実装し、ハンドラー
サフィックスが付き、アプリまたはプラグインのMiddleware\UnauthorizedHandler
名前空間の下に存在する必要があります。
構成オプションは、最後のパラメーターとしてハンドラーのhandle()
メソッドに渡されます。
ハンドラーは、Authorization\Exception\Exception
クラスを拡張する例外のみをキャッチします。