ijagjeet / laravel-sso
适用于 Laravel 的简单 PHP SSO 集成
Requires
- php: ^7.2.5
- guzzlehttp/guzzle: ^6.0|^7.0
- laravel/framework: ^5.5|^7.0|^8.0
README
此包是从 https://github.com/ijagjeet/laravel-sso 分支出来的,并进行了一些修改
本包基于 Simple PHP SSO 框架,并使其适用于 Laravel 框架。
要求
- Laravel 5.5+
- PHP 7.1+
词汇含义
- SSO - 单点登录。
- 服务器 - 作为 SSO 服务器工作的页面,处理身份验证,存储所有会话数据。
- 代理 - 您的页面,由客户端/用户访问。
- 客户端/用户 - 您的每一位访客。
它是如何工作的?
客户端访问代理并生成唯一令牌。当生成新令牌时,我们需要将客户端会话附加到代理中的会话,以便将客户端重定向到服务器,然后返回到代理。此时,在服务器中将会创建新的会话,并与代理页面中的客户端会话相关联。当客户端访问其他代理时,将执行相同的步骤,只是当客户端被重定向到服务器时,他已使用其旧会话和与代理 #1 相关的相同会话 ID。
安装
服务器
使用 composer 安装此包。
$ composer require ijagjeet/laravel-sso
将配置文件复制到 Laravel 项目的 config/ 文件夹。
$ php artisan vendor:publish --provider="IJagjeet\LaravelSSO\SSOServiceProvider"
创建一个表,用于保存所有代理。
$ php artisan migrate --path=vendor/ijagjeet/laravel-sso/database/migrations
编辑您的 app/Http/Kernel.php 文件,通过从 api 中间件数组中删除 throttle 中间件并添加 sessions 中间件来编辑。这是必要的,因为我们需要在 API 路由中使用会话,而 throttle 中间件可能会阻止所需的连接。
'api' => [ 'bindings', \Illuminate\Session\Middleware\StartSession::class, ],
现在,您应该创建代理。您可以使用以下 Artisan CLI 命令创建新的代理
$ php artisan sso:broker:create {name}
之后,在用户模型中,您可以在以下内容中添加对代理的关系
public function broker() { return $this->belongsToMany(Broker::class) ->where('deleted_at', NULL) ->withTimestamps(); }
现在,您可以使用 Laravel 的基本功能注册或创建用户,然后按以下方式设置该用户的代理
$user->broker()->sync($brokers)
在这里,$user 是 User 模型的对象,而 $brokers 是代理 ID 的数组。
代理
使用 composer 安装此包。
$ composer require ijagjeet/laravel-sso
将配置文件复制到 Laravel 项目的 config/ 文件夹。
$ php artisan vendor:publish --provider="IJagjeet\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 表中。
可选地设置您的服务器身份验证用户字段所在的列(默认为 'username').env 文件
SSO_USERNAME_FIELD=email
编辑您的 app/Http/Kernel.php 文件,将 \IJagjeet\LaravelSSO\Middleware\SSOAutoLogin::class 中间件添加到 web 中间件组。它应该看起来像这样
protected $middlewareGroups = [ 'web' => [ ... \IJagjeet\LaravelSSO\Middleware\SSOAutoLogin::class, ], 'api' => [ ... ], ];
最后但同样重要的是,您需要编辑 app/Http/Controllers/Auth/LoginController.php。您应该在 LoginController 类中添加两个函数,这些函数将通过 SSO 服务器而不是代理页面来验证您的客户端。
protected function attemptLogin(Request $request) { $broker = new \IJagjeet\LaravelSSO\LaravelSSOBroker; $credentials = $this->credentials($request); return $broker->login($credentials[$this->username()], $credentials['password']); } public function logout(Request $request) { $broker = new \IJagjeet\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