segrax/open-policy-agent

Open Policy Agent 客户端和 PSR-7、PSR-15 授权中间件

0.5.0 2024-03-06 19:26 UTC

This package is auto-updated.

Last update: 2024-09-06 20:40:31 UTC


README

本库为 Open Policy Agent (OPA) 提供客户端,OPA 是一个 PSR-15 授权中间件和一个 PSR-15 打包分发中间件。

Latest Version Packagist Software License Build Status codecov

有关工作示例,请参阅 segrax/opa-php-examples,并提供教程,以指导您通过示例。

安装

使用 composer 安装最新版本。

composer require segrax/open-policy-agent

使用示例

客户端使用

use Segrax\OpenPolicyAgent\Client;
use GuzzleHttp\Client as GuzzleHttpClient;

$apiPolicy = "package my.api
              default allow=false
              allow {
                  input.path = [\"abc\"]
                  input.user == \"a random user\"
              }";

$client = new Client(null, new GuzzleHttpClient(), new RequestFactory(), 'http://127.0.0.1:8181', 'MyToken');

// Push a policy to the agent
$client->policyUpdate('my/api', $apiPolicy, false);

// Execute the policy
$inputs = [ 'path' => ['abc'],
            'user' => 'a random user'];

$res = $client->policy('my/api', $inputs, false, false, false, false );
if ($res->getByName('allow') === true ) {
    // Do stuff
}

授权中间件

创建客户端,并将授权对象添加到中间件堆栈中

use Segrax\OpenPolicyAgent\Client;
use Segrax\OpenPolicyAgent\Middleware\Authorization;

$app = AppFactory::create();

$client = new Client(null, new GuzzleHttpClient(), new RequestFactory(), 'http://127.0.0.1:8181', 'MyToken');
$app->add(new Authorization(
                [Authorization::OPT_POLICY => 'auth/api'],
                $client,
                $app->getResponseFactory()));

分发中间件

插入中间件,它将为具有有效 JWT 且子字段为 'opa' 的用户响应 /opa/bundles/{service_name} 的打包请求

use Segrax\OpenPolicyAgent\Client;
use Segrax\OpenPolicyAgent\Middleware\Distributor;

$app = AppFactory::create();

$app->add(new Distributor(
                        '/opa/bundles/',        // Route
                        __DIR__ . '/opa',       // Policy Path
                        [Distributor::OPT_AGENT_USER => 'opa'], // Token Sub Field
                        $app->getResponseFactory(),
                        new StreamFactory(),
                        $app->getLogger()));

// Add a GET route for the opa bundle route
$app->get('/opa/bundles/{name}', function (Request $request, Response $response, array $args) {
    return $response->withStatus(404);
});

代码测试

make tests

安全

如果您发现任何安全相关的问题,请通过电子邮件 robcrossfield@gmail.com 联系。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件