j-oppenhuis/laravel-saml2

SAML支持使Laravel应用程序既能作为SAML IDP,也能作为SAML SP。

2.1.0 2021-04-28 17:53 UTC

This package is not auto-updated.

Last update: 2024-09-27 02:56:51 UTC


README

这个仓库最初是kingstarter/laravel-saml的分支。它已经从那时起发展壮大,现在可以为任何Laravel应用程序提供以下功能:1 - 成为IDP 2 - 生成用于签名消息、签名断言和加密属性的证书。这些证书使用从配置文件中输入的数据 3 - 配置要发送的属性(从配置文件中) 4 - 为每个SP配置是否应签名消息和/或断言 5 - 在注销页面提供通过iframe从任何服务提供者注销的能力

此包使维护和IDP变得非常容易。文档需要一点工作,如果您愿意帮忙,请告诉我。

安装

基本包安装

使用composer

composer require "pkeogan/laravel-saml2":"dev-master"

Laravel 5.4

将服务提供者添加到config/app.php

    Pkeogan\LaravelSaml\LaravelSamlServiceProvider::class,

Laravel 5.5+

此包支持Laravel的包自动发现,应在需要时自动通过composer加载。如果包未自动发现,则运行

    php artisan package:discover

配置

有一个配置文件需要发布,以及需要扩展的config/filesystem.php文件。以下命令

php artisan vendor:publish --tag="saml_config"

将发布config/saml.php文件。

文件系统配置

config/filesystem.php中需要添加以下条目

    'disks' => [

        ...
        
        'saml' => [
            'driver' => 'local',
            'root' => storage_path().'/saml',
        ],

    ],

填写配置文件

进行中

生成元数据和证书

配置填写正确后,运行以下命令生成元数据和证书。请注意,如果没有找到证书,系统将生成它们。如果您想覆盖证书,请使用--cert标志

php artisan laravel-saml:generate-meta

SAML SP条目

在saml.php配置文件中,需要填写SAML服务提供者数组。

    'sp' => [

        //Tableau
        'https://sso.online.tableau.com/public/sp/SSO?alias=xxxx-xxxx-xxxx-xxxx-xxxxxxxx' => [
            'entity-id' => 'https://sso.online.tableau.com/public/sp/metadata?alias=xxxx-xxxx-xxxx-xxxx-xxxxxxxx',
            'certificate' => 'MIICozC........dUvTnGP18g=='
        ],

        //A nifty testing service provider
        'https://sptest.iamshowcase.com/acs' => [

        ]

    ],

使用SAML包

要使用SAML包,需要修改一些文件。在您的登录视图中,可能是resources/views/auth/login.blade.php,在CSRF字段下方添加一个SAMLRequest字段(这实际上是一个很好的地方)

    {{-- The hidden CSRF field for secure authentication --}}
    {{ csrf_field() }}
    {{-- Add a hidden SAML Request field for SAML authentication --}}
 	@if(isset($_GET['SAMLRequest']))
        <input type="hidden" id="SAMLRequest" name="SAMLRequest" value="{{ $_GET['SAMLRequest'] }}">
    @elseif(isset($saml))
        <input type="hidden" id="SAMLRequest" name="SAMLRequest" value="{{ $saml }}">
    @endif
    @if( config('saml.logout_apps_via_iframe') && session('samlLogout') ) 
	  	@include('saml::logout')
  	@endif

SAMLRequest字段将在通过http请求发送SAMLRequest时自动填充,从而启动SAML身份验证尝试。要启动SAML身份验证,需要修改登录和重定向函数。在app/Http/Controllers/Auth/LoginController.php中将use AuthenticatesUsers更改为use SamlAuthenticatesUsers

use App\Http\Controllers\Controller;
use KingStarter\LaravelSaml\Http\Traits\SamlAuthenticatesUsers;

class LoginController extends Controller
{
...

      /**
     * The user has been authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  mixed  $user
     * @return mixed
     */
    protected function authenticated(Request $request, $user)
    {
        if(Auth::check() && isset($request['SAMLRequest'])) {
            $this->handleSamlLoginRequest($request);
        }

        return redirect()->intended($this->redirectPath());
    }

.....

为了允许在有人已经登录时进行后续直接重定向,我们还需要在app/Http/Middleware/RedirectIfAuthenticated.php中添加一些行

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
use Pkeogan\LaravelSaml\Http\Traits\SamlAuth;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class RedirectIfAuthenticated
{
        use SamlAuth;

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle(Request $request, Closure $next, $guard = null)
    {
		if(Auth::check() && isset($request['SAMLRequest'])){
            $saml = $this->handleSamlLoginRequest($request);
			return new Response(view('saml::post')->withSaml($saml));
        } 
		
        if(Auth::guard($guard)->check() && !isset($request['SAMLRequest']) ) {
            return redirect('/');
        }
        return $next($request);
    }
}

HTTP-POST绑定

如果您使用HTTP POST绑定,则需要允许saml通过POST获取登录请求。

在web.php中添加新路由

....
Auth::routes();
Route::post('/postLogin', 'Auth\LoginController@showLoginForm');

您还需要将CSRF豁免添加到App\Http\Middleware\VerifyCsrfToken

class VerifyCsrfToken extends Middleware { /** * 应排除CSRF验证的URI。 * * @var array */ protected $except = [ 'login/saml', 'logout/saml' ]; }

连接调试

您可以通过config/saml.php设置debug_saml_request启用日志记录。

    // Allow debugging within SamlAuth trait to get SP data  
    // during SAML authentication request
    'debug_saml_request' => true,

确保将环境日志变量APP_LOG_LEVEL在您的.env文件中设置为debug。它将记录到storage/logs/laravel.log