peppertech/larakeycloak

使用KeyCloak Socialite Provider提供身份验证和授权

v0.1.1 2021-02-13 11:18 UTC

This package is not auto-updated.

Last update: 2024-09-22 04:29:33 UTC


README

概述

LaraKeycloak 通过 KeyCloak Socialite Provider 提供身份验证,并通过检查来自 Keycloak 的用户角色提供基于角色的访问控制(RBAC)授权。

功能

Keycloak 配置

在安装LaraKeycloak之前,请配置您的Keycloak服务器以将应用程序添加为客户端。

创建Keycloak客户端

Client

在Keycloak客户端中添加用户角色

Roles

创建用户并分配角色

创建至少一个普通用户和一个管理员用户,以供稍后测试授权。

Roles

安装

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.phpboot 方法中定义您的门。
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未授权页面。