権限制御ライブラリCasbinのSlimでの応用


PHP-Casbinは、さまざまなアクセス制御モデルに基づく権限管理をサポートする強力で効率的なオープンソースアクセス制御フレームワークです.
SlimはPHPマイクロフレームワークで、シンプルだが強力なWebアプリケーションとAPIをすばやく作成できます.
Casbinは、Slim Frameworkの1つである ミドルウェアとして使用することができる.
資格認定
先に認証し、後で許可します.
ここではHTTP Basic Authenticationを使用します.
slim-basic-authはPSR-7とPSR-15の基本認証ミドルウェアを提供し、composerを使用してインストールできます:composer require tuupola/slim-basic-auth.
$app->add(new HttpBasicAuthentication([
    'users' => [
        'root' => 't00r',
        'somebody' => 'passw0rd',
    ],
    'before' => function ($request, $arguments) {
        return $request->withAttribute('user', $arguments['user']);
    },
]));

Casbinライセンスミドルウェア
この例では、ライセンスミドルウェアを実装します.
まず、現在認証されているuser、現在要求されているuri、およびmethodを取得し、その後、Casbinを使用して権限決定を行います.

namespace App\Middleware;

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Psr7\Response;
use Casbin\Enforcer;

class Authorization
{
    /**
     * Authorization middleware invokable class.
     *
     * @param ServerRequest  $request PSR-7 request
     * @param RequestHandler $handler PSR-15 request handler
     *
     * @return Response
     */
    public function __invoke(Request $request, RequestHandler $handler): Response
    {
        $e = new Enforcer('config/rbac_model.conf', 'config/policy.csv');

        $user = $request->getAttribute('user');
        $uri = $request->getUri();
        $action = $request->getMethod();

        if ($user && !$e->enforce($user, $uri->getPath(), $action)) {
            $response = new Response();
            $response->withStatus(403)->getBody()->write('Unauthorized.');

            return $response;
        }

        $response = $handler->handle($request);

        return $response;
    }
}

Modelファイルconfig/rbac_model.confの内容は以下の通りです.
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && r.act == p.act

ポリシーファイルconfig/policy.csvの内容は次のとおりです.
p, root, /, GET
p, root, /users, GET
p, root, /users/:id, GET

ルーティングの作成
$app->get('/', function (Request $request, Response $response) {
    $response->getBody()->write('Hello Casbin !');
    return $response;
});

$app->group('/users', function (Group $group) {
    $group->get('', ListUsersAction::class);
    $group->get('/{id}', ViewUserAction::class);
});

Casbinスケルトン応用
完全なコード:Casbin skeleton application with Slim Framework 4.
Slim Framework 4を使用して新しいCasbinスケルトンアプリケーションを構成することが容易になります.