j-oppenhuis / laravel-saml2
SAML支持使Laravel应用程序既能作为SAML IDP,也能作为SAML SP。
Requires
- php: >=5.5.9
- illuminate/support: ^5.2|^6.0|^7.0|^8.0
- lightsaml/lightsaml: ^2.1
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