codegreencreative / laravel-samlidp
使用SAML 2.0将您的PHP Laravel应用程序转换为身份提供者。此包允许您使用SAML 2.0标准实现自己的身份提供者(idP),以与支持SAML 2.0服务提供者(SP)一起使用。
Requires
- php: ^7.2.5|^8.0
- ext-zlib: *
- illuminate/routing: ^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^7.0|^8.0|^9.0|^10.0|^11.0
- laravel/framework: ^7.0|^8.0|^9.0|^10.0|^11.0
- litesaml/lightsaml: ^4.0
Requires (Dev)
- laravel/pint: ^1.17
- dev-master
- v5.2.10
- v5.2.9
- v5.2.8
- v5.2.7
- v5.2.6
- v5.2.5
- v5.2.4
- 5.2.3
- v5.2.2
- v5.2.1
- v5.2.0
- v5.1.2
- v5.1.1
- v5.1.0
- v5.0.8
- v5.0.7
- v5.0.6
- v5.0.5
- v5.0.4
- v5.0.3
- v5.0.2
- v5.0.1
- v5.0.0
- 4.x-dev
- v4.1.5
- v4.1.4
- v4.1.3
- v4.1.2
- v4.1.1
- v4.1.0
- v4.0.0
- 3.x-dev
- v3.2.5
- v3.2.4
- v3.2.3
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.0
- v3.0.0
- 2.0.x-dev
- v2.0.9
- v2.0.8
- v2.0.7
- v2.0.6
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- 1.0.x-dev
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-feature/flexible-nameid
- dev-feature/rewrite
This package is auto-updated.
Last update: 2024-09-11 13:38:17 UTC
README
买我一杯咖啡 ☕
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_CERT
和SAMLIDP_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'], ];
设置服务提供者证书
有三种方法可以设置服务提供者证书。
- 以字符串的形式提供证书
<?php return [ // ... 'sp' => [ // Base64 encoded ACS URL 'aHR0cHM6Ly9teWZhY2Vib29rd29ya3BsYWNlLmZhY2Vib29rLmNvbS93b3JrL3NhbWwucGhw' => [ // ... // SP certificate // 'certificate' => "-----BEGIN CERTIFICATE-----\nb3BlbnNzaC1rZXktdjEA...LWdlbmVyYXRlZC1rZXkBAgM\n-----END CERTIFICATE-----" ], ], // ... ];
- 从
.env
文件中的变量加载。您可以选择一个最适合您项目要求的变量名。
<?php return [ // ... 'sp' => [ // Base64 encoded ACS URL 'aHR0cHM6Ly9teWZhY2Vib29rd29ya3BsYWNlLmZhY2Vib29rLmNvbS93b3JrL3NhbWwucGhw' => [ // ... // SP certificate // 'certificate' => env('SAML_SP_CERTIFICATE', '') ], ], // ... ];
- 从文件加载证书
<?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, ];
买我一杯咖啡 ☕