vduit / laravel-sso
为 Laravel 简单的 PHP SSO 集成
Requires
- php: >=7.2
- guzzlehttp/guzzle: ^6.3
- laravel/framework: >=7.0
- zefy/php-simple-sso: ^1.0
README
此软件包基于 Simple PHP SSO 框架 并进行了修改,以适应 Laravel 框架。
要求
- Laravel 5.5+
- PHP 7.1+
词汇含义
- SSO - 单点登录。
- 服务器 - 作为 SSO 服务器工作的页面,处理身份验证,存储所有会话数据。
- 代理 - 被客户端/用户访问的页面。
- 客户端/用户 - 每位访客。
它是如何工作的?
客户端访问代理,并生成一个唯一的令牌。当生成新的令牌时,我们需要将客户端会话附加到代理中的其会话上,因此他会重定向到服务器,然后再回到代理。此时,服务器中将创建新的会话,并将其与代理页面中的客户端会话关联起来。当客户端访问其他代理时,将执行相同的步骤,但除了当客户端被重定向到服务器时,他已使用他的旧会话和与代理 #1 关联的相同会话 ID。
安装
服务器
使用 composer 安装此软件包。
$ composer require zefy/laravel-sso
将配置文件复制到 Laravel 项目的 config/
文件夹。
$ php artisan vendor:publish --provider="Zefy\LaravelSSO\SSOServiceProvider"
创建一个表,用于存储所有代理。
$ php artisan migrate --path=vendor/zefy/laravel-sso/database/migrations
编辑你的 app/Http/Kernel.php
,通过从 api
中间件数组中删除速率限制中间件,并添加会话中间件到 api
中间件数组。这是必要的,因为我们需要在 API 路由中使用会话,而速率限制中间件可能会阻塞我们需要的连接。
'api' => [ 'bindings', \Illuminate\Session\Middleware\StartSession::class, ],
现在你应该创建代理。你可以使用以下 Artisan CLI 命令创建新的代理
$ php artisan sso:broker:create {name}
代理
使用 composer 安装此软件包。
$ composer require zefy/laravel-sso
将配置文件复制到 Laravel 项目的 config/
文件夹。
$ php artisan vendor:publish --provider="Zefy\LaravelSSO\SSOServiceProvider"
将 config/laravel-sso.php
文件中的 type
值从 server
更改为 broker
。
在 .env
文件中设置 3 个新选项
SSO_SERVER_URL= SSO_BROKER_NAME= SSO_BROKER_SECRET=
SSO_SERVER_URL
是你的服务器 http url(不带尾部斜杠)。SSO_BROKER_NAME
和 SSO_BROKER_SECRET
必须是存在于你的服务器 brokers
表中的数据。
编辑你的 app/Http/Kernel.php
,向 web
中间件组添加 \Zefy\LaravelSSO\Middleware\SSOAutoLogin::class
中间件。它应该看起来像这样
protected $middlewareGroups = [ 'web' => [ ... \Zefy\LaravelSSO\Middleware\SSOAutoLogin::class, ], 'api' => [ ... ], ];
最后但并非最不重要的是,你需要编辑 app/Http/Controllers/Auth/LoginController.php
。你应该在 LoginController
类中添加两个函数,这些函数将通过 SSO 服务器而不是代理页面来验证你的客户端。
protected function attemptLogin(Request $request) { $broker = new \Zefy\LaravelSSO\LaravelSSOBroker; $credentials = $this->credentials($request); return $broker->login($credentials[$this->username()], $credentials['password']); } public function logout(Request $request) { $broker = new \Zefy\LaravelSSO\LaravelSSOBroker; $broker->logout(); $this->guard()->logout(); $request->session()->invalidate(); return redirect('/'); }
就这么多。对于其他代理页面,你应该从开始重复所有步骤,只需在配置文件中更改你的代理名称和密钥。
示例 .env
选项
SSO_SERVER_URL=https://server.test SSO_BROKER_NAME=site1 SSO_BROKER_SECRET=892asjdajsdksja74jh38kljk2929023