PHP caspian-это мощная и эффективная система контроля доступа с открытым исходным кодом, которая поддерживает управление правами на основе различных моделей контроля доступа.
Slim-это микро-фреймворк PHP, который помогает вам быстро создавать простые, но мощные веб-приложения и API.
Caspian может использоваться в качестве одного из slim фреймворка для предоставления авторизации промежуточного программного обеспечения.
идентификация
Аутентификация перед авторизацией.
Здесь мы используем базовую аутентификацию HTTP
Slim basic auth предоставляет промежуточное программное обеспечение для базовой аутентификации psr-7 и psr-15. Вы можете использовать composer для установки: composer требует tuupola/slim-basic-auth 。
$app->add(new HttpBasicAuthentication([
'users' => [
'root' => 't00r',
'somebody' => 'passw0rd',
],
'before' => function ($request, $arguments) {
return $request->withAttribute('user', $arguments['user']);
},
]));Промежуточное программное обеспечение для авторизации Каспия
В этом примере реализовано промежуточное программное обеспечение авторизации.
Сначала он получает текущий сертифицированный пользователь , запрошенный в данный момент uri и метод , а затем с помощью Кабины Переходит к принятию решений о полномочиях.
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;
}
}
Файл модели 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);
});Применение каспийского скелета
Полный код: приложение caspian skeleton с slim framework 4
Это позволяет легко и быстро настраивать новые приложения с помощью slim framework 4 Кабина Каркас.