kcpal/

laravel-sso

Laravel 的简单 PHP SSO 集成

1.0.6 2018-03-23 07:51 UTC

This package is auto-updated.

Last update: 2024-09-05 02:23:03 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License Scrutinizer Code Quality Build Status Code Intelligence Status

此包从 https://github.com/zefy/laravel-sso 分支而来,进行了一些修改

此包基于 Simple PHP SSO skeleton 包,并使其适用于 Laravel 框架。

要求

  • Laravel 5.5+
  • PHP 7.1+

词语含义

  • SSO - 单点登录。
  • 服务器 - 作为 SSO 服务器工作的页面,处理身份验证,存储所有会话数据。
  • 代理 - 客户端/用户访问的页面。
  • 客户端/用户 - 您的每位访客。

它是如何工作的?

客户端访问代理并生成唯一的令牌。当生成新令牌时,我们需要将客户端会话附加到代理的会话中,以便用户被重定向到服务器,然后返回代理。此时,服务器将创建新的会话并将其与代理页面的客户端会话关联起来。当客户端访问其他代理时,将执行相同的步骤,但客户端重定向到服务器时将使用其旧会话和与代理 #1 关联的相同会话 ID。

安装

服务器

使用 composer 安装此包。

$ composer require kcpal/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 中间件数组中删除 throttle 中间件并添加 sessions 中间件来编辑它。这是必要的,因为我们需要在 API 路由中工作 sessions,而 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)

在这里,$userUser 模型的对象,$brokers 是代理 ID 的数组。

代理

使用 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_NAMESSO_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