codegreencreative/laravel-samlidp

使用SAML 2.0将您的PHP Laravel应用程序转换为身份提供者。此包允许您使用SAML 2.0标准实现自己的身份提供者(idP),以与支持SAML 2.0服务提供者(SP)一起使用。

v5.2.10 2024-09-07 13:30 UTC

README

Latest Version on Packagist Total Downloads

买我一杯咖啡

Laravel SAML IdP

此包允许您使用SAML 2.0标准实现自己的身份提供者(idP),以与支持SAML 2.0服务提供者(SP)一起使用。

  • 从版本^5.1开始,支持Laravel 9。
  • 从版本^5.2.4开始,支持Laravel 10。
  • 从版本^5.2.9开始,支持Laravel 11。

在此版本中,我们将允许使用Laravel ^7.0或^8.0。

如果您正在寻找Laravel ^5.6,请参阅v1.0

如果您正在寻找Laravel ^6.0,请使用v2.0

安装

composer require codegreencreative/laravel-samlidp

配置

php artisan vendor:publish --tag="samlidp_config"

文件系统配置

// config/filesystem.php

'disks' => [

        ...

        'samlidp' => [
            'driver' => 'local',
            'root' => storage_path() . '/samlidp',
        ]
],

使用以下命令为您自己的IdP创建自签名证书。如果您将certname或keyname更改为除默认名称之外的其他名称,您需要更新config/samlidp.php配置文件以反映这些新文件名。

php artisan samlidp:cert [--days <days> --keyname <name> --certname <name>]
Options:
  --days=<days>      Days to add for the expiration date [default: 7800]
  --keyname=<name>   Name of the certificate key file [default: key.pem]
  --certname=<name>  Name of the certificate file [default: cert.pem]

可选地,您可以使用两个环境变量SAMLIDP_CERTSAMLIDP_KEY设置证书和密钥。

使用

在您的登录视图中,可能是resources/views/auth/login.blade.php,在CSRF指令下添加SAMLRequest指令

@csrf
@samlidp

SAMLRequest指令将在HTTP请求发送SAMLRequest时自动填写隐藏输入,因此启动SAML身份验证尝试。要启动SAML身份验证,登录和重定向过程需要被干预。这是通过在身份验证时触发的Laravel事件完成的。

配置

在您发布配置文件后,您需要设置服务提供者。服务提供者的密钥是64位编码的消费者服务(ACS) URL的键。您可以从服务提供者处获取此信息,但您需要将URL进行64位编码并放置在您的配置中。这是由于配置点表示法。

您可以使用此命令帮助生成新的SAML服务提供者

php artisan samlidp:sp

config/samlidp.php文件中的示例SP

<?php

return [
    // The URI to your login page
    'login_uri' => 'login',
    // The URI to the saml metadata file, this describes your idP
    'issuer_uri' => 'saml/metadata',
    // List of all Service Providers
    'sp' => [
        // Base64 encoded ACS URL
        'aHR0cHM6Ly9teWZhY2Vib29rd29ya3BsYWNlLmZhY2Vib29rLmNvbS93b3JrL3NhbWwucGhw' => [
            // ACS URL of the Service Provider
            'destination' => 'https://example.com/saml/acs',
            // Simple Logout URL of the Service Provider
            'logout' => 'https://example.com/saml/sls',
            // SP certificate
            // 'certificate' => '',
            // Turn off auto appending of the idp query param
            // 'query_params' => false,
            // Turn off the encryption of the assertion per SP
            // 'encrypt_assertion' => false
        ],
    ],
    // List of guards saml idp will catch Authenticated, Login and Logout events (thanks @abublihi)
    'guards' => ['web'],
];

设置服务提供者证书

有三种方法可以设置服务提供者证书。

  1. 以字符串的形式提供证书
<?php

return [
    // ...
    'sp' => [
        // Base64 encoded ACS URL
        'aHR0cHM6Ly9teWZhY2Vib29rd29ya3BsYWNlLmZhY2Vib29rLmNvbS93b3JrL3NhbWwucGhw' => [
            // ...
            // SP certificate
            // 'certificate' => "-----BEGIN CERTIFICATE-----\nb3BlbnNzaC1rZXktdjEA...LWdlbmVyYXRlZC1rZXkBAgM\n-----END CERTIFICATE-----"
        ],
    ],
    // ...
];
  1. .env文件中的变量加载。您可以选择一个最适合您项目要求的变量名。
<?php

return [
    // ...
    'sp' => [
        // Base64 encoded ACS URL
        'aHR0cHM6Ly9teWZhY2Vib29rd29ya3BsYWNlLmZhY2Vib29rLmNvbS93b3JrL3NhbWwucGhw' => [
            // ...
            // SP certificate
            // 'certificate' => env('SAML_SP_CERTIFICATE', '')
        ],
    ],
    // ...
];
  1. 从文件加载证书
<?php

return [
    // ...
    'sp' => [
        // Base64 encoded ACS URL
        'aHR0cHM6Ly9teWZhY2Vib29rd29ya3BsYWNlLmZhY2Vib29rLmNvbS93b3JrL3NhbWwucGhw' => [
            // ...
            // SP certificate
            // 'certificate' => 'file://' . storage_path('samlidp/service-provider.pem')
        ],
    ],
    // ...
];

在SLO完成后从IdP注销

如果您希望在SLO完成后从IdP注销,请在.env中将LOGOUT_AFTER_SLO设置为true并执行IdP的注销操作。

// .env

LOGOUT_AFTER_SLO=true

在注销后重定向到SLO发起者

如果您希望将用户返回到通过SLO发起的服务提供者,您可以向/saml/logout路由提供额外的查询参数,例如

https://idp.com/saml/logout?return_to=mysp.com

所有SP(服务提供者)登出后,用户将被重定向到 mysp.com。要正确实现此功能,您需要将 sp_slo_redirects 选项添加到您的 config/samlidp.php 配置文件中,例如:

<?php

// config/samlidp.php

return [
    // If you need to redirect after SLO depending on SLO initiator
    // key is beginning of HTTP_REFERER value from SERVER, value is redirect path
    'sp_slo_redirects' => [
        'mysp.com' => 'https://mysp.com',
    ],
];

属性(可选)

服务提供者可能需要通过断言发送更多的附加属性。甚至有可能他们需要相同的信息,但以不同的声明类型。

默认情况下,此包将发送以下声明类型

ClaimTypes::EMAIL_ADDRESS 作为 auth()->user()->email ClaimTypes::GIVEN_NAME 作为 auth()->user()->name

这是因为Laravel迁移默认情况下只提供了SAML 2.0可用的电子邮件和姓名字段。

要添加额外的声明类型,您可以订阅断言事件

CodeGreenCreative\SamlIdp\Events\Assertion

订阅事件

在您的 App\Providers\EventServiceProvider 类中,将以下内容添加到现有的 $listen 属性...

protected $listen = [
    'App\Events\Event' => [
        'App\Listeners\EventListener',
    ],
    'CodeGreenCreative\SamlIdp\Events\Assertion' => [
        'App\Listeners\SamlAssertionAttributes'
    ]
];

示例监听器

<?php

namespace App\Listeners;

use LightSaml\ClaimTypes;
use LightSaml\Model\Assertion\Attribute;
use CodeGreenCreative\SamlIdp\Events\Assertion;

class SamlAssertionAttributes
{
    public function handle(Assertion $event)
    {
        $event->attribute_statement
            ->addAttribute(new Attribute(ClaimTypes::PPID, auth()->user()->id))
            ->addAttribute(new Attribute(ClaimTypes::NAME, auth()->user()->name));
    }
}

摘要算法(可选)

有关所有摘要选项,请参阅 \RobRichards\XMLSecLibs\XMLSecurityDSig

<?php

return [
    // Defind what digital algorithm you want to use
    'digest_algorithm' => \RobRichards\XMLSecLibs\XMLSecurityDSig::SHA1,
];

买我一杯咖啡