pitbulk/laravel4-saml2

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

0.0.5 2016-11-01 09:18 UTC

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