uisits/laravel-oidc

Laravel Socialite 的 Shibboleth OIDC 驱动程序

v10.0.3 2024-01-22 20:22 UTC

README

本扩展包扩展了 Laravel 的原生包 socialite,用于通过 Shibboleth 进行身份验证和授权。

用法

  • 安装包: composer require uisits/laravel-oidc
  • 可选:将服务提供者添加到 config/app.php 文件。 UisIts/Oidc/ShibbolethServiceProvider::class
  • 重要: 安装包: php artisan shibboleth:install
  • 在 .env 文件中设置环境变量(检查 config/shibboleth.php 文件)

迁移数据库

运行 php artisan migrate

注意

对于授权,在 .env 文件中设置 APP_AD_AUTHORIZE_GROUP

您可以使用 gates 或直接使用用户模型来检查用户是否为管理员。例如

In AuthServiceProvider:
Gate::define('admin', function (User $user) {
   return $user->hasRole('admin');
});

To check if user is admin you can either use:
User::find()->hasRole

OR

Gate::allows('admin')

使用 SAML 身份验证

  • 设置 SAML 环境变量
  • config/shibboleth.php 中将类型属性设置为 saml

使用 OIDC 身份验证

  • 设置 OIDC 环境变量
  • config/shibboleth.php 中将类型属性设置为 oidc

设置身份验证路由

routes/web.php 文件中设置身份验证路由

use UisIts\Oidc\Http\Controllers\AuthController;

Route::name('login')->get('login', [AuthController::class, 'login']);

Route::name('callback')->get('/auth/callback', [AuthController::class, 'callback']);

Route::name('logout')->get('/logout', [AuthController::class, 'logout']);

授权

  • 在 .env 文件中定义 ad 组名
  • 您可以通过覆盖 config/shibboleth.php 文件中的 redirect_to 属性来配置重定向路由,以便在成功身份验证后使用。
  • config/shibboleth.php 文件中的 authorization 属性下设置组的名称 'authorization' => env('APP_AD_AUTHORIZE_GROUP', null)
  • HasRoles 特性添加到 Users 模型
    use Spatie\Permission\Traits\HasRoles;
    class User extends Authenticatable
    {
        use HasRoles;
    }
  • 在您的 app/AuthServiceProvider.php 文件中,您现在可以在应用程序的任何位置使用以下逻辑分配 Gates 或检查用户是否为管理员
      # In AuthServiceProvider
      Gate::define('admin', function (User $user) {
          return $user->hasRole('admin');
      });
      # OR
      $user->hasRole('admin');

您可以使用 Spatie Permission 包 扩展角色和权限功能,以添加新的角色或权限

令牌自省

对于使用 OIDC 的令牌自省,请将以下中间件添加到 app/Http/Kernel.php 文件中

alias 属性下

'introspect' => \UisIts\Oidc\Http\Middleware\Introspect::class,

现在您可以在受保护的路由上使用此中间件

use UisIts\Oidc\Http\Middleware\Introspect;

Route::middleware(['introspect'])->get('/introspect', function (Request $request) {
    dump($request->bearerToken());
    dd(Introspect::getUserFromToken($request->bearerToken()));
})->name('introspect');

注意:以下是从令牌获取用户时收到的响应

Introspect::getUserFromToken($request->bearerToken());

array:8 [▼ // routes/api.php:24
  "sub" => "xyz@abc.org"
  "uisedu_is_member_of" => array:42 [▶]
  "uisedu_uin" => "123456789"
  "preferred_username" => "xyz"
  "given_name" => "John"
  "preferred_display_name" => "Doe, John"
  "family_name" => "Doe"
  "email" => "xyz@abc.org"
];

代码风格

您可以使用 Laravel pint 自动修复代码风格。 ./vendor/bin/pint

测试

您可以使用 pest 运行包的测试。 ./vendor/bin/pest

问题和关注点

请在 GitHub 仓库中打开一个带有详细描述和日志(如果有的话)的问题。

如果对安全有顾虑,请给 UIS ITS ADDS Team 发送电子邮件。