overtrue / laravel-saml
基于OneLogin的SAML PHP Toolkit的Laravel SAML工具包。
Requires
- ext-openssl: *
- laravel/framework: ^9.0|^10.0
- onelogin/php-saml: ^4.0
Requires (Dev)
- brainmaestro/composer-git-hooks: dev-master
- laravel/pint: ^1.5
- mockery/mockery: ^1.4
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-13 06:10:32 UTC
README
基于 OneLogin的SAML PHP Toolkit 的Laravel SAML工具包。
安装
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。
❤️ 赞助我
如果您喜欢我的项目并想支持它,点击这里 ❤️
项目由JetBrains支持
非常感谢JetBrains慷慨地为我提供许可证,以便我可以从事这个和其他开源项目。
贡献
您可以通过以下三种方式之一进行贡献
代码贡献过程并不非常正式。您只需确保您遵循PSR-0、PSR-1和PSR-2编码指南。任何新的代码贡献都必须附带适用的单元测试。
PHP 扩展包开发
想知道如何从零开始构建PHP扩展包吗?
请关注我的实战课程,我将在该课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》
许可协议
MIT