crjhoan / laravel-saml
SAML支持使Laravel应用程序既能作为SAML IDP,也能作为SAML SP。
Requires
- php: >=5.5.9
- lightsaml/lightsaml: ^1.3
This package is auto-updated.
Last update: 2024-09-28 01:53:09 UTC
README
不再积极开发:由于我现在无法继续开发这个存储库,并且有很多分叉和PR,我非常乐意将存储库转让给其他人。请通过给我发送电子邮件至 git@kingstarter.de 来告知我。
Laravel SAML
Laravel-SAML实现了一个SAML2 IDP插件,可以将Laravel转换为SAML身份提供者(IDP),除了常规认证之外。该包设计用于与Laravel 5.4或更高版本一起使用。
该包基于Dustin Parham关于在Laravel中实现SAML IDP的指南。为了更好地了解SAML的一般概念,请阅读Cheung的SAML for Web Developers。
安装
基本包安装
使用composer
composer require "kingstarter/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的Package Auto Discovery,应该在需要时自动加载。如果包未自动发现,请运行
php artisan package:discover
配置
有一个要发布的配置文件和一个需要扩展的config/filesystem.php文件。以下命令将发布config/saml.php文件。
php artisan vendor:publish --tag="saml_config"
SAML SP条目
在saml.php配置文件中,需要填写SAML Service Provider数组。以下是从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
当通过HTTP请求发送SAMLRequest时,SAMLRequest字段将自动填充,从而启动SAML认证尝试。为了启动SAML认证,需要修改登录和重定向功能。在app/Http/Middleware/AuthenticatesUsers.php
文件中,将以下行添加到顶部和认证函数中:(注意:您可能需要将其从vendor/laravel/framework/src/Illuminate/Foundation/Auth/目录复制到您的Middleware目录中)
<?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认证请求时遇到问题,可以在配置文件中使用调试设置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
设置为debug。