kn4ppster/laravel4-saml2

此包已弃用,不再维护。未建议替代包。

Laravel 4.2 的 Saml2 集成包,作为 SP(服务提供商),基于 OneLogin 工具包,比 simplesamlphp 更轻量。

0.0.3 2016-07-07 10:21 UTC

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或建议,或开启问题。