jvangrouw / laravel-saml
SAML支持,使Laravel应用程序同时成为SAML身份提供者(IDP)和SAML服务提供者(SP)。
Requires
- php: >=7.2
- litesaml/lightsaml: ^4.2
This package is auto-updated.
Last update: 2024-09-21 21:34:51 UTC
README
Laravel-SAML实现了一个SAML2 IDP插件,将Laravel转换为SAML身份提供者(IDP),除了常规的认证外。该包设计用于与Laravel 5.4或更高版本一起工作。
该包基于Dustin Parham关于使用Laravel实现SAML IDP的指南。要更好地了解SAML,请阅读Cheung的SAML for Web Developers。
安装
基本包安装
使用composer
composer require "jvangrouw/laravel-saml":"dev-master"
Lightsaml依赖问题
如果您遇到关于symfony 4(事件调度器)的当前lightsaml依赖问题,您可能需要考虑使用允许使用symfony 4的lightsaml分支。
Laravel 5.4
将服务提供者添加到config/app.php
KingStarter\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文件。
SAML服务提供者条目
在saml.php配置文件中,需要填充SAML服务提供者数组。下面是config/saml.php文件中的一个示例
'sp' => [
/**
* Sample SP entry
* The entry is identified by the base64 encoded URL. This example shows a possible entry for
* a SimpleSamlPhp service provider running on localhost:
*
* Sample URL: https:///samlsp/module.php/saml/sp/saml2-acs.php/default-sp
* Base64 encoded URL: aHR0cHM6Ly9sb2NhbGhvc3Qvc2FtbHNwL21vZHVsZS5waHAvc2FtbC9zcC9zYW1sMi1hY3MucGhwL2RlZmF1bHQtc3A=
*/
'aHR0cHM6Ly9sb2NhbGhvc3Qvc2FtbHNwL21vZHVsZS5waHAvc2FtbC9zcC9zYW1sMi1hY3MucGhwL2RlZmF1bHQtc3A=' => [
// The destination is the consuming SAML URL. This might be a SamlAuthController receiving the SAML response.
'destination' => 'https:///samlsp/module.php/saml/sp/saml2-acs.php/default-sp',
// Issuer could be anything, mostly it makes sense to pass the metadata URL
// This is the IDP Entity ID that will be sent to the SP.
'issuer' => 'https://',
// OPTIONAL: Use a specific audience restriction value when creating the SAMLRequest object.
// Default value is the assertion consumer service URL (the base64 encoded SP url).
// This is a bugfix for Nextcloud as SP and can be removed for normal SPs.
'audience_restriction' => 'https://',
// OPTIONAL: Use to override the default email attribute to set a custom NameID value for a SP
// The NameID attribute must be a property on the User model.
'nameID' => 'username',
],
],
您可以使用以下Artisan命令生成base_64编码的AssertionURL。
$ php artisan laravel-saml:encodeurl https://sp.webapp.com/saml/login -- URL Given: https://sp.webapp.com/saml/login Encoded AssertionURL:aHR0cHM6Ly9zcC53ZWJhcHAuY29tL3NhbWwvbG9naW4=
config/saml.php
'sp' => [
...
/**
* New entry
*
* Sample URL: https://sp.webapp.com/saml/login
* Base64 encoded URL: aHR0cHM6Ly9zcC53ZWJhcHAuY29tL3NhbWwvY29uc3VtZQ==
*/
'aHR0cHM6Ly9zcC53ZWJhcHAuY29tL3NhbWwvY29uc3VtZQ==' => [
'destination' => 'https://sp.webapp.com/saml/consume',
'issuer' => 'https://sp.webapp.com',
],
],
文件系统配置
在config/filesystem.php
中需要添加以下条目
'disks' => [
...
'saml' => [
'driver' => 'local',
'root' => storage_path().'/saml',
],
],
该包控制器使用storage/saml
路径来检索证书和元数据文件。首先创建存储路径,然后添加或链接证书。还需要为SAML IDP添加一个元数据文件。有关生成IDP metadata.xml文件的帮助,请参阅https://www.samltool.com/idp_metadata.php。
mkdir -p storage/saml/idp
touch storage/saml/idp/{metadata.xml,cert.pem,key.pem}
将metadata.xml、cert.pem和key.pem文件的内容添加到IDP。
使用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'] }}">
@endif
SAMLRequest字段将在SAMLRequest通过http请求发送时自动填充,从而启动SAML认证尝试。要启动SAML认证,需要修改登录和重定向函数。在app/Http/Middleware/AuthenticatesUsers.php
中,向顶部和已认证函数添加以下行:(注意:您可能需要将其从vendor/laravel/framework/src/Illuminate/Foundation/Auth/复制到您的中间件目录)
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Auth\RedirectsUsers;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use KingStarter\LaravelSaml\Http\Traits\SamlAuth;
trait AuthenticatesUsers
{
use RedirectsUsers, ThrottlesLogins, SamlAuth;
...
protected function authenticated(Request $request, $user)
{
if(Auth::check() && isset($request['SAMLRequest'])) {
$this->handleSamlLoginRequest($request);
}
}
...
为了允许在有人已经登录的情况下稍后直接重定向,我们还需要向app/Http/Middleware/RedirectIfAuthenticated.php
添加一些行
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use KingStarter\LaravelSaml\Http\Traits\SamlAuth;
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, Closure $next, $guard = null)
{
if(Auth::check() && isset($request['SAMLRequest'])){
$this->handleSamlLoginRequest($request);
}
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
}
SAML服务提供者(SPs)
要添加一个或多个服务提供者,请转到config/saml.php配置文件,并滚动到'sp'数组。获取SAML-SP的登录地址,添加另一个条目。由于内部解释的原因,URL需要Base64编码。
调试SP条目
如果在接收Base64字符串或评估SAML认证请求方面存在问题,可以在配置文件中使用debugger设置saml.debug_saml_request
。
// Allow debugging within SamlAuth trait to get SP data
// during SAML authentication request
'debug_saml_request' => true,
确保在您的.env
文件中将环境日志变量APP_LOG_LEVEL
设置为调试模式。