agrodata / keycloak-guard
用于通过keycloak授权使用权限的包
1.10
2024-03-13 18:01 UTC
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.2
- illuminate/validation: ^9.19.0
- robsontenorio/laravel-keycloak-guard: ^1.4.2
README
<img src="https://img.shields.io/packagist/v/agrodata/keycloak-guard.svg" />
<img src="https://img.shields.io/packagist/dt/agrodata/keycloak-guard.svg" />
Keycloak Guard
负责在Laravel项目中实现Keycloak的认证和授权的库。认证使用了Robson Tenorio的库(keycloak-guard),对于授权(权限管理),则扩展了这个库,实现了在keycloak中搜索认证用户权限的功能。
安装
使用以下命令通过composer安装包
composer require agrodata/keycloak-guard
然后,在`config/app.php`文件中添加以下行
<?php #config/app.php
'providers' => [
...
Agrodata\Keycloak\KeycloakGuardServiceProvider::class
]
在`config/auth.php`文件中添加`agrodata-keycloak`作为guard
<?php #config/auth.php
...
'guards' => [
'api' => [
'driver' => 'agrodata-keycloak',
'provider' => 'users'
]
...
],
配置
要了解如何在keycloak中配置权限,请参考以下文章:https://www.appsdeveloperblog.com/fine-grained-authorization-services-in-keycloak/
认证配置
要配置认证,应使用父库的文档: https://github.com/robsontenorio/laravel-keycloak-guard#configuration
授权配置
权限配置将保存在一个独立的配置文件中,因为这是一个可选的功能。
<?php # config/agrodata-keycloak.php
return [
'enabled' => env('AGRODATA_KC_ENABLED', true),
'endpoint' => env('AGRODATA_KC_ENDPOINT'),
'client-id' => env('AGRODATA_KC_CLIENT_ID'),
'realm' => env('AGRODATA_KC_REALM'),
'concat-resource-scope' => env('AGRODATA_KC_CONCAT_RESOURCE_SCOPE', true),
];
">
. Resultará em string de permissões: ```book.read```, ```book.write```<br>
资源/服务
资源保护
配置库后,用户权限将注册在Laravel的`Gate`中,因此可以使用这些权限来保护API资源。以下是一个保护路由的示例
<?php #routes\api.php
Route::middleware('can:book.read')->get('/book/list');
Route::middleware('can:book.write')->post('/book/store', 'Gravação do recurso');
服务
该库使用以下服务类在认证后从keycloak中搜索权限和资源。但是,如果您想在系统的任何其他地方使用此服务,也没有问题。示例
<?php
/**
* Autenticação | Buscar Bearer token do usuário
*/
$bearerToken = (new \Agrodata\Keycloak\KeycloakAuthService($username, $passwrd))->auth($clientSecret)
/**
* Instanciar Serviço
*
* Recebe token por parametro. Caso nulo, busca em cache o token do usuário autenticddo
*/
$kcService = new Agrodata\Keycloak\KeycloakService($bearerToken = null);
/**
* Buscar permissões
*/
$permissions = $kcService->getOpenIdPermissions(); #busca permissões do token informado na api do keycloak
ou
$permissions = array_keys(Gate::abilities()) #busca permissões de cache registrados após autenticação
/**
* Criar subgrupo no keycloak
*/
$kcService->createSubGroup('Novo subgrupo 1', 'Grupo A');