peppertech / larakeycloak
使用KeyCloak Socialite Provider提供身份验证和授权
v0.1.1
2021-02-13 11:18 UTC
Requires
- firebase/php-jwt: ^5.0
- laravel/socialite: ^5.1
- socialiteproviders/keycloak: ^4.1
This package is not auto-updated.
Last update: 2024-09-22 04:29:33 UTC
README
概述
LaraKeycloak 通过 KeyCloak Socialite Provider 提供身份验证,并通过检查来自 Keycloak 的用户角色提供基于角色的访问控制(RBAC)授权。
功能
- 通过 KeyCloak Socialite Provider 提供身份验证
- 通过KeyCloak管理的RBAC提供授权
Keycloak 配置
在安装LaraKeycloak之前,请配置您的Keycloak服务器以将应用程序添加为客户端。
创建Keycloak客户端
在Keycloak客户端中添加用户角色
创建用户并分配角色
创建至少一个普通用户和一个管理员用户,以供稍后测试授权。
安装
composer require peppertech/larakeycloak
配置
环境变量
集成
发布文件
运行以下命令将文件发布到您的应用程序中。
php artisan vendor:publish --tag="larakeycloak"
这将复制以下文件
app/Http/Controllers/LaraKeyController.php
,这是/auth/redirect
和 '/auth/callback' 路由的控制器。app/Policies/SampleAdminPolicy.php
,一个用于为admin
角色保护应用程序中某些页面的示例管理员策略resources/views/sample_admin_blade.php
,带有/sample/admin
路由的示例管理员视图。app/Http/Controllers/SampleAdminController.php
,/sample/admin
路由的控制器。
路由
在您的 app/routes/web.php
中创建以下路由
Route::group(['middleware' => ['auth:web']], function () {
...
Route::get('/sample/admin', 'SampleAdminController@index')->name('sample-admin');
});
Route::get('/auth/redirect', 'LaraKeycloakController@redirect')->name('auth-redirect');
Route::get('/auth/callback', 'LaraKeycloakController@callback')->name('auth-callback');
Route::get('logout', '\App\Http\Controllers\Auth\LoginController@logout');
在您的 LoginController
中添加以下 logout
方法
use Illuminate\Support\Facades\Auth;
use PepperTech\LaraKeycloak\LaraKeycloak;
....
public function logout()
{
$larakc = new LaraKeyCloak();
$larakc->logout();
Auth::guard('web')->logout();
return redirect()->guest(route('main')); // `main` is the route name of public homepage
}
Socialite Keycloak 设置
参考:https://socialiteproviders.com/Keycloak/#installation-basic-usage
- 在您的
config/services.php
中添加以下内容
'keycloak' => [
'client_id' => env('KEYCLOAK_CLIENT_ID'),
'client_secret' => env('KEYCLOAK_CLIENT_SECRET'),
'redirect' => env('KEYCLOAK_REDIRECT_URI'),
'base_url' => env('KEYCLOAK_BASE_URL'),
'realms' => env('KEYCLOAK_REALMS'),
'realm_public_key' => env('KEYCLOAK_REALM_PUBLIC_KEY'),
],
- 在
app/Providers/EventServiceProvider.php
中添加以下内容
use SocialiteProviders\Manager\SocialiteWasCalled;
protected $listen = [
....
SocialiteWasCalled::class => [
// add your listeners (aka providers) here
'SocialiteProviders\\Keycloak\\KeycloakExtendSocialite@handle',
],
];
- 在
config/app.php
中添加SocialiteProviders\Manager\ServiceProvider::class
并取消注释Laravel\Socialite\SocialiteServiceProvider::class
(如果之前已添加)。
'providers' => [
...
// Laravel\Socialite\SocialiteServiceProvider::class,
SocialiteProviders\Manager\ServiceProvider::class,
]
身份验证中间件
- 在
app/Http/Middleware/Authenticate.php
中更改redirectTo
方法。此更改将在未认证的用户访问网站受保护部分时重定向到Keycloak登录。
protected function redirectTo($request)
{
if (! Auth::check()) {
return route('auth-redirect');
}
}
授权
授权由Keycloak中的用户角色提供。`PepperTech\LaraKeycloak\LaraKeycloak` 类有一个公共方法 `hasRole`,用于检查当前登录用户是否有该角色。`hasRole` 可以与 Laravel 授权 一起使用。
定义门
- 在
app/Providers/AuthServiceProvider.php
的boot
方法中定义您的门。
public function boot()
{
$this->registerPolicies();
Gate::define('view-admin', [SampleAdminPolicy::class, 'view']);
// define more Gates here
}
策略
- 在
app/Policies/SampleAdminPolicy.php
中提供了一个示例策略,它使用了LaraKeycloak的 `hasRole` 方法。 - 在
app/Htttp/Controllers/SampleAdminController.php
中提供了一个示例管理员视图控制器。检查这里如何使用门来检查用户的页面查看权限。
测试
- 要测试是否一切正常,请转到
http://[your domain]/sample/admin
。这应该会重定向到Keycloak登录页面。 - 使用具有 'admin' 角色的Keycloak用户登录。
- 登录后,您应该能看到示例管理员页面。
- 注销,然后再次转到
http://[your domain]/sample/admin
。这次,请使用没有admin
角色的用户登录。 - 登录后,您应该看到403未授权页面。