pitbulk / laravel4-saml2
一个基于OneLogin工具集的Laravel 4.2包,用于Saml2集成作为SP(服务提供者),比simplesamlphp更轻量。
Requires
- php: >=5.4.0
- illuminate/support: 4.2.*
- onelogin/php-saml: 2.10.1
This package is auto-updated.
Last update: 2024-08-29 04:31:10 UTC
README
这是一个基于OneLogin工具集的Laravel包,用于Saml2集成作为SP(服务提供者),比simplesamlphp SP更轻量且易于安装。它不需要独立的路由或会话存储即可工作!
此库的目标是尽可能简单。我们不会干扰Laravel用户、认证、会话等。我们更喜欢专注于具体任务。要求用户在IDP(身份提供者)处进行认证并处理响应。SLO请求也是同样的情况。
安装 - Composer
要将Saml2作为Composer包安装以与Laravel 4一起使用,只需将以下内容添加到您的composer.json中
"pitbulk/laravel4-saml2": "^0.0.5"
..然后运行 composer update
。一旦安装完毕,您可以在app/config/app.php
中的providers
数组中注册服务提供者
'providers' => array( 'Pitbulk\Saml2\Saml2ServiceProvider', )
然后使用php artisan config:publish pitbulk/laravel4-saml2
发布配置文件。这将添加文件app/config/packages/pitbulk/laravel4-saml2/saml_settings.php
。此配置几乎直接由onelogin处理,因此您可以在那里找到更多参考,但这里将涵盖真正必要的内容。
配置
一旦您将saml_settings.php发布到自己的文件中,您需要配置您的SP和IDP(远程服务器)。此配置与OneLogin使用的配置之间的唯一真正差异是,SP的entityId、assertionConsumerService URL和singleLogoutService URL由库注入。它们分别从路由'saml_metadata'、'saml_acs'和'saml_sls'中获取。
您可以根据需要创建特定环境的配置文件,例如app/config/packages/pitbulk/laravel4-saml2/dev/saml_settings.php
您可以通过访问'http://laravel_url/saml2/metadata'来获取设置IDP所需的相关元数据。例如,如果您使用simplesamlphp,您在/metadata/sp-remote.php
中的配置应类似于以下内容
$metadata['http://laravel_url/saml2/metadata'] = array( 'AssertionConsumerService' => 'http://laravel_url/saml2/acs', 'SingleLogoutService' => 'http://laravel_url/saml2/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' );
路由
该包将自动注入路由以与IDP一起使用。默认情况下,URL以saml2为前缀,但您可以在saml_settings.php中的routesPrefix
设置中更改此设置。以下URL将被创建
使用方法
当您想让用户登录时,只需调用Saml2Auth::login()
。只需记住,它不使用任何会话存储,因此您必须在调用它之前自己检查会话。一个好的开始地方是在auth过滤器中。
Route::filter('auth', function() { if (Auth::guest()) { return Saml2Auth::login(URL::full()); // The users intended URL is saved in RelayState } });
这会将用户重定向到身份提供者(IDP),在用户认证后,用户将被返回到断言消费者服务端点(默认为 'http://laravel_url/saml2/acs')。在处理响应后,库将触发一个事件,saml2.loginRequestReceived
。您需要编写代码来监听此事件,并在 Laravel 中处理登录过程的其余部分。此代码可以放置在 app/start/global.php
或,如果您已创建它,在 app/events.php
中。有关处理事件的更多信息,请参阅 Laravel 文档。
Event::listen('saml2.loginRequestReceived', function(Saml2User $saml2User) { // Useful data in $saml2User: // $saml2User->getAttributes(); // $saml2User->getUserId(); // base64_decode($saml2User->getRawSamlAssertion()); // $saml2User->getIntendedUrl() // Find user by ID or attribute $user = User::find($samlUser->getUserId); $user = User::where('email', $samlUser->getNameId()); if(!$user) { // If the user does not exist, create a new one just in time, or show an error message } // Create the login session for the user Auth::login($user); });
您还需要检查您的登录页面(如果您已创建一个)
登出
用户有两种登出方式。
用户在您的应用中登出
在这种情况下,您应该首先通知 IDP 以关闭全局会话。您不应该立即结束用户的会话,这是在 IDP 发送登出确认时完成的。这可以通过调用 Saml2Auth::logout()
或通过将用户重定向到名为 'saml_logout' 的路由(默认为 'http://laravel_url/saml2/logout')来实现。一个登出请求将被发送到 IDP,IDP 将向默认为 'http://laravel_url/saml2/sls' 的单点登出服务 URL 发送响应。当发生这种情况时,将触发事件 saml2.logoutRequestReceived
,您应该处理此事件并在 Laravel 中结束用户的会话。
Event::listen('saml2.logoutRequestReceived', function() { Auth::logout(); //echo "bye, we logged out."; });
用户从 IPP 登出
用户可以直接在 IDP 服务中登出,或者从另一个发送登出请求到 IDP 的 SP(如第一个登出情况所述)登出。在这种情况下,IDP 将向与第一个情况相同的单点登出服务端点发送请求,因此您的代码应该已经处理了一切。
就这些了。请随时提问,提交 PR 或建议,或打开问题。
派生自
Lavarel 4 - Saml2 参考:https://github.com/Kn4ppster/laravel4-saml2