agrodata / keycloak-authz
🔑 Keycloak Guard 授权用于 Laravel/Lumen
此包的官方仓库似乎已消失,因此已冻结此包。
Requires
- php: ^7.3
- ext-curl: *
- firebase/php-jwt: ^5.0
Requires (Dev)
- orchestra/testbench: ^3.7@dev
- phpunit/phpunit: ^7.3@dev
This package is auto-updated.
Last update: 2022-12-31 00:19:35 UTC
README
Laravel/Lumen Keycloak Authz
此包是为了实现 Keycloak 对 Laravel/Lumen API 的认证和授权。
基于 laravel-keycloak-guard 包创建,增加了以下功能
- 在本地数据库中注册用户数据
- 管理授权/权限
要求
✔️ API 在 Laravel/Lumen 上构建。
✔️ 您无法使用 Laravel Passport,因为 Keycloak 会完成所需的工作。
✔️ 前端项目应与后端分离。
✔️ 前端将直接在 Keycloak 服务器 上进行认证,并将令牌发送到后端。
✔️ 前端保持 Keycloak 服务器的 JWT 令牌。
✔️ 前端使用此令牌向 API 发送请求。
✔️ 要使用权限和 middleware can,Keycloak 客户端必须激活并配置 授权 功能。
(x) 如果您没有这些要求,可能需要使用 https://socialiteproviders.com/Keycloak 或 https://github.com/Vizir/laravel-keycloak-web-guard
前端通过服务器 Keycloak 进行认证并获得 AccessToken。
前端通过发送 access token 到 api 发起请求。
API 通过
Keycloak Guard
验证 accessToken。- 验证令牌签名。
- 验证令牌结构。
- 验证令牌过期时间。
- 验证 API 是否允许令牌的
resource access
。 - 检查令牌中是否包含权限/授权
3.1 如果令牌有效,则更新数据库中的用户数据。
检查用户的权限(如果
search_permission
已激活)通过 middleware :can 验证权限(如果
search_permission
已激活)返回响应
安装
Laravel / Lumen
安装此包
composer require agrodata/keycloak-authz
用于 Lumen
在您的 bootstrap `
app.php`
文件中注册 Provider
在文件末尾添加以下行。
$app->register(\KeycloakGuard\KeycloakGuardServiceProvider::class);
要使用 Facades,请取消注释您的 bootstrap/app.php
文件中的 $app->withFacades();
行
配置
Keycloak Guard
Keycloak Guard 的配置可以通过 .env 文件进行。⚠️ 确保所有字符串都带有双引号。
可选:您可以发布配置文件。
php artisan vendor:publish --provider="Agrodata\KeycloakAuthz\KeycloakGuardServiceProvider"
<?php
return [
'realm_public_key' => env('KEYCLOAK_REALM_PUBLIC_KEY', null),
'load_user_from_database' => env('KEYCLOAK_LOAD_USER_FROM_DATABASE', true),
'user_provider_credential' => env('KEYCLOAK_USER_PROVIDER_CREDENTIAL', 'username'),
'token_principal_attribute' => env('KEYCLOAK_TOKEN_PRINCIPAL_ATTRIBUTE', 'preferred_username'),
'append_decoded_token' => env('KEYCLOAK_APPEND_DECODED_TOKEN', false),
'allowed_resources' => env('KEYCLOAK_ALLOWED_RESOURCES', null),
/**
* autorization attributes
*/
'search_permissions' => env('KEYCLOAK_SEARCH_PERMISSIONS', true),
'client_id' => env('KEYCLOAK_CLIENT_ID', null),
'token_endpoint' => env('KEYCLOAK_TOKEN_ENDPOINT', null),
];
✔️ realm_public_key
必需。
Keycloak 服务器 realm 公钥(字符串)。
如何获取 realm 公钥?点击 "Realm 设置" > "密钥" > "算法 RS256" 行 > "公钥" 按钮
✔️ load_user_from_database
必需。默认值为 true
。
如果您没有 users
表,您应禁用此属性。 load_user_from_database
将检查您是否已在数据库中拥有此用户,执行数据更新并将它们返回到认证对象 (Auth::class)。如果启用,则必须与 user_provider_credential
和 token_principal_attribute
属性一起工作。
✔️ user_provider_credential
必需。默认值为 username
。
表格“users”的字段应包含一个唯一标识符(例如,用户名、电子邮件、昵称)。在身份验证过程中,将与token_principal_attribute
属性进行比较。
✔️ token_principal_attribute
必需。默认值为preferred_username
。
JWT令牌的属性,将用作唯一标识符。在身份验证过程中,将与user_provider_credential
属性进行比较。
✔️ append_decoded_token
默认值false
。
将解码的令牌(包含用户信息)附加到$user->token
。用于获取诸如配置文件、组和其他附加到JWT的信息。如果为false
,您也可以通过Auth::token()
获取它。
✔️ allowed_resources
必需。
通常,您的API应处理一个resource_access。但如果您处理多个,请仅使用逗号分隔的资源列表,这些资源是API接受的。此属性将在身份验证过程中与JWT的resource_access
属性进行比较。
✔️ search_permission
必需。
默认值false
。
检查JWT令牌是否包含授权/授权信息。如果没有,它将在Keycloak服务器上查找授权数据,以记录权限并使用中间件“:can”保护路由。这取决于token_endpoint
和client_id
属性是否正确提供。
✔️ client_id
可选。
默认值null
。
在Keycloak服务器上标识具有激活的授权/权限模块的客户端。
✔️ token_endpoint
默认值null
。
可选。
用于在Keycloak服务器上查找令牌授权信息的URL。
Laravel Auth
在config/auth.php
中修改。
...
'defaults' => [
'guard' => 'api', # <-- For sure, i`m building an API
'passwords' => 'users',
],
....
'guards' => [
'api' => [
'driver' => 'keycloak', # <-- Set the API guard driver to "keycloak"
'provider' => 'users',
],
],
Laravel Routes
将通过令牌验证来保护路由,请在routes/api.php
中修改。
// public endpoints
Route::get('/hello', function () {
return ':)';
});
// protected endpoints
Route::group(['middleware' => 'auth:api'], function () {
Route::get('/protected-endpoint', 'SecretController@index');
// more endpoints ...
});
Lumen Routes
将通过令牌验证来保护路由,请在routes/web.php
中修改。
// public endpoints
$router->get('/hello', function () {
return ':)';
});
// protected endpoints
$router->group(['middleware' => 'auth'], function () {
$router->get('/protected-endpoint', 'SecretController@index');
// more endpoints ...
});
API
Keycloak Guard Illuminate\Contracts\Auth\Guard
的简单实现。因此,所有Laravel标准方法都将可用。例如:Auth::user()
将返回已验证的用户。
标准方法
- check()
- guest()
- user()
- id()
- validate()
- setUser()
Keycloak Guard方法
- token()
例如:Auth::token()
返回完整的解码令牌。
- hasRole('some-resource', 'some-role'):检查用户是否具有特定配置文件。
示例
'resource_access' => [
'myapp-backend' => [
'roles' => [
'myapp-backend-role1',
'myapp-backend-role2'
]
],
'myapp-frontend' => [
'roles' => [
'myapp-frontend-role1',
'myapp-frontend-role2'
]
]
]
Auth::hasRole('myapp-backend', 'myapp-backend-role1') // true
Auth::hasRole('myapp-frontend', 'myapp-frontend-role1') // true
Auth::hasRole('myapp-backend', 'myapp-frontend-role1') // false