kn4ppster / laravel4-saml2
Laravel 4.2 的 Saml2 集成包,作为 SP(服务提供商),基于 OneLogin 工具包,比 simplesamlphp 更轻量。
Requires
- php: >=5.4.0
- illuminate/support: 4.2.*
- onelogin/php-saml: 2.9.0
This package is not auto-updated.
Last update: 2020-03-11 11:24:05 UTC
README
一个用于 Saml2 集成的 Laravel 包,作为 SP(服务提供商)基于 OneLogin 工具包,比 simplesamlphp SP 更轻量且易于安装。它不需要独立的路由或会话存储即可工作!
此库的目标是尽可能简单。我们不会干扰 Laravel 用户、认证、会话...我们更喜欢限制自己只完成具体任务。要求用户在 IDP(身份提供者)处进行认证并处理响应。SLO 请求也是同样的情况。
安装 - Composer
要将 Saml2 作为 Composer 包安装,以便与 Laravel 4 一起使用,只需将以下内容添加到您的 composer.json 中
"kn4ppster/laravel4-saml2": "0.0.1"
然后运行 composer update
。安装完成后,您可以在 app/config/app.php
中的 providers
数组中注册服务提供者。
'providers' => array( 'Kn4ppster\Saml2\Saml2ServiceProvider', )
然后使用 php artisan config:publish kn4ppster/laravel4-saml2
发布配置文件。这将添加文件 app/config/packages/kn4ppster/laravel4-saml2/saml_settings.php
。此配置几乎直接由 one login 处理,您可以在那里找到更多参考,但这里将涵盖真正必要的部分。
配置
一旦您将 saml_settings.php 发布到自己的文件中,您需要配置您的 SP 和 IDP(远程服务器)。此配置与 OneLogin 使用配置之间的唯一真正区别是,SP entityId、assertionConsumerService URL 和 singleLogoutService URL 是由库注入的。它们分别从路由 'saml_metadata'、'saml_acs' 和 'saml_sls' 中获取。
请记住,您不需要实现这些路由,但您需要将它们添加到 IDP 配置中。例如,如果您使用 simplesamlphp,请将以下内容添加到 /metadata/sp-remote.php
$metadata['http://laravel_url/saml/metadata'] = array( 'AssertionConsumerService' => 'http://laravel_url/saml/acs', 'SingleLogoutService' => 'http://laravel_url/saml/sls', //the following two affect what the $Saml2user->getUserId() will return 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', 'simplesaml.nameidattribute' => 'uid' );
您可以通过实际导航到 'http://laravel_url/saml/metadata' 来检查这些元数据
使用
当您希望用户登录时,只需调用 Saml2Auth::login()
。只需记住,它不使用任何会话存储,所以如果您要求它登录,无论用户是否已登录,它都会重定向到 IDP。例如,您可以将 auth 过滤器更改为。
Route::filter('auth', function() { if (Auth::guest()) { return SAML2::login(URL::full()); //url is saved in RelayState } });
只有当您想知道时,才会将用户重定向到 IDP,并返回库在 /saml2/acs 服务的端点。这将处理响应并在准备就绪时触发事件。因此,下一步是处理响应。
Event::listen('saml2.loginRequestReceived', function(Saml2User $user) { //$user->getAttributes(); //$user->getUserId(); //base64_decode($user->getRawSamlAssertion(); $laravelUser = //find user by ID or attribute //if it does not exist create it and go on or show an error message Auth::login($laravelUser); });
注销
现在有两种方式可以让用户注销。
- 1 - 在您的应用程序中注销:在这种情况下,您应该首先通知 IDP 以关闭全局会话。
- 2 - 从全局 SSO 会话中注销。在这种情况下,IDP 将在 /saml2/slo 端点(已提供)通知您。
对于案例1,调用Saml2Auth::logout();
或重定向用户到路由'saml_logout',这个路由正是执行这个操作。不要立即关闭会话,因为你需要从IDP(重定向)接收响应确认。这个响应将在/saml2/sls处由库处理,并为你触发一个事件以完成操作。
对于案例2,你将只接收到事件。案例1和案例2都会接收到相同的事件。
Event::listen('saml2.logoutRequestReceived', function() { Auth::logout(); //echo "bye, we logged out."; });
就是这些。欢迎提问、提出PR或建议,或开启问题。