overtrue/laravel-saml

基于OneLogin的SAML PHP Toolkit的Laravel SAML工具包。

资助包维护!
overtrue

1.1.0 2023-02-15 07:22 UTC

This package is auto-updated.

Last update: 2024-09-13 06:10:32 UTC


README

基于 OneLogin的SAML PHP Toolkit 的Laravel SAML工具包。

Sponsor me

安装

composer require overtrue/laravel-saml

配置

php artisan vendor:publish --tag=saml-config

此命令将添加文件 config/saml.php。此配置几乎直接由 OneLogin 处理,因此您可能需要在那里获取更多参考,但这里将涵盖真正必要的部分。还有一些关于路由的其他配置您可能想查看,它们相当简单。

用法

如果您的应用程序仅用于登录到指定的IdP,您只需在 config/saml.php 中配置 idp 部分。

idp配置解析器

为了支持多个IdP,您需要配置以下方法以获取IdP的配置。

Saml::configureIdpUsing(function($idpName): array {
    return [...]; 
});

您需要返回IdP的配置数组,有关结构,请参阅 config/saml.php 中的 idp 部分。

入口点控制器

您可以创建一个控制器来执行SAML集成

$ php artisan make:controller SamlController

然后我们准备以下5个必要的方法。

<?php

namespace App\Http\Controllers;

use Overtrue\LaravelSaml\Saml;

class SamlController extends Controller
{
    public function login() {}
    public function acs() {}
    public function logout() {}
    public function sls() {}
    public function metadata() {}
}

入口点路由

然后配置 routes/web.php 中的路由

您可以使用您首选的路由前缀,例如,我们使用 saml 作为路由前缀

use App\Http\Controllers\SamlController;

Route::get('saml/login', [SamlController::class, 'login'])->name('saml.login');
Route::get('saml/logout', [SamlController::class, 'logout'])->name('saml.logout');
Route::post('saml/acs', [SamlController::class, 'acs'])->name('saml.acs');
Route::get('saml/sls', [SamlController::class, 'sls'])->name('saml.sls');
Route::get('saml/metadata', [SamlController::class, 'metadata'])->name('saml.metadata');

重定向到IdP登录服务

启动SSO过程,创建一个AuthnRequest,返回一个Laravel重定向响应。

    //<...>
    public function login(Request $request)
    {
        // Use the default idp in the configuration
        return Saml::redirect(); 
        
        // Or specify the idp name
        return Saml::idp($request->get('idp'))->redirect();
    }

断言消费者服务(ACS)

此方法用于处理IdP授权回调,SamlAuth::getAuthenticatedUser 将验证请求并返回一个 Overtrue\LaravelSaml\SamlUser 对象。

//<...>
    public function acs(Request $request)
    {
        // Overtrue\LaravelSaml\SamlUser
        $samlUser = Saml::getAuthenticatedUser();
        // Or specify the idp name
        //$samlUser = Saml::idp($request->get('idp'))->getAuthenticatedUser(); 
        
        $samlUserId = $samlUser->getNameId();
        
        // SamlUser to app User
        // $user = User::FirstOrCreate(['email' => $samlUser->getNameId()]);
        Auth::set($user);
        
        return redirect('/home')
    }

重定向到IdP注销服务

创建一个重定向响应到IdP注销服务。

    //<...>
    public function logout(Request $request)
    {
        // Use the default IdP in the configuration
        return Saml::redirectToLogout(); 
        
        // Or specify the IdP name
        return Saml::idp($request->get('idp'))->redirectToLogout();
    }

IdP将通过用户的客户端将注销响应返回到SP的单点注销服务(路由 saml/sls)。

单点注销服务(SLS)

此代码处理注销请求和注销响应。

    //<...>
    public function sls(Request $request)
    {
        $auth = Saml::handleLogoutRequest();
        // Or specify the IdP name
        //$auth = Saml::idp($request->get('idp'))->handleLogoutRequest();
    
        Auth::logout();
        
        return redirect('/home')
    }

元数据

此代码将提供我们SP的XML元数据文件,基于我们在设置文件中提供的信息。

    //<...>
    public function metadata(Request $request)
    {
        if ($request->has('download')) {
            return Saml::getMetadataXMLAsStreamResponse();
            // or specify a filename to the xml file:
            // return Saml::getMetadataXMLAsStreamResponse('sp-metadata.xml');
        }
        
        return Saml::getMetadataXML();
    }

更多

有关配置和使用的更多信息,请参阅源代码或阅读 onelogin/php-saml

❤️ 赞助我

Sponsor me

如果您喜欢我的项目并想支持它,点击这里 ❤️

项目由JetBrains支持

非常感谢JetBrains慷慨地为我提供许可证,以便我可以从事这个和其他开源项目。

贡献

您可以通过以下三种方式之一进行贡献

  1. 使用 问题跟踪器 提交错误报告。
  2. 问题跟踪器 上回答问题或修复错误。
  3. 贡献新功能或更新wiki。

代码贡献过程并不非常正式。您只需确保您遵循PSR-0、PSR-1和PSR-2编码指南。任何新的代码贡献都必须附带适用的单元测试。

PHP 扩展包开发

想知道如何从零开始构建PHP扩展包吗?

请关注我的实战课程,我将在该课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》

许可协议

MIT