如何在Laravel的多租户设置中使用护照

时间:2018-12-11 18:57:21

标签: laravel multi-tenant laravel-passport

先决条件:

  1. Laravel版本:5.7
  2. Hyn /多租户包5.3
  3. Laravel护照

所以我有一个Laravel应用程序已经在使用护照进行身份验证。现在,当前用户登录时,我使用以下控制器授权用户并授予访问令牌

public function login(Request $request)
    {
        $http = new \GuzzleHttp\Client;
        try {
            $response = $http->post(config('services.passport.login_endpoint'), [
                'form_params' => [
                    'grant_type' => 'password',
                    'client_id' => config('services.passport.client_id'),
                    'client_secret' => config('services.passport.client_secret'),
                    'username' => $request->username,
                    'password' => $request->password,
                ]
            ]);
            return $response->getBody();
        } catch (\GuzzleHttp\Exception\BadResponseException $e) {
            if ($e->getCode() === 400) {
                return response()->json('Invalid Request. Please enter a username or a password.', $e->getCode());
            } else if ($e->getCode() === 401) {
                return response()->json('Your credentials are incorrect. Please try again', $e->getCode());
            }
            return response()->json('Something went wrong on the server.', $e->getCode());
        }
    }

但是,有些事情是硬编码的,因此对于多租户设置来说是行不通的。

services.passport.client_idservices.passport.client_secret

它们是为后端的单个实例生成的。但是,当我设置多租户时,每个租户将有单独的client_idclient_secret

所以我想要的工作流程基本上是这样的

  1. 我作为管理员为租户注册一个新的后端实例
  2. hyn \ multi-tenant软件包将为新的租户创建一个数据库
  3. 该租户的新数据库将包含访问令牌和cliet_secret

至此已完成并且已经起作用,下面是我要理解的部分

  1. 我的前端有一个完全独立的代码库,可通过API与后端进行通信。
    1. 因此属于租户实例的前端用户将尝试使用我在上面显示的login控制器进行登录,但是我的帖子的重点和问题是我根据用户\租户数据库动态调用client_idclient_secret

我知道这可能要消化很多,但是如果有人有想法,我会全神贯注。预先谢谢你!

1 个答案:

答案 0 :(得分:2)

要做的第一件事是创建一个自定义的PassportClient,PassportAuthCode,PassportPersonalAccessClient,PassportToken模型,该模型连接到您的租户连接

use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\AuthCode;

class PassportAuthCode extends AuthCode
{use UsesTenantConnection;}

use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\Client;

class PassportClient extends Client
{use UsesTenantConnection;}

use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\PersonalAccessClient;

class PassportPersonalAccessClient extends PersonalAccessClient
{use UsesTenantConnection;}

use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\Token;

class PassportToken extends Token
{use UsesTenantConnection;}

创建此类后,我们需要告诉护照使用我们的自定义实现。只需将以下行添加到您的AuthServiceProvider文件中

Passport::useClientModel(PassportClient::class);
Passport::useTokenModel(PassportToken::class);
Passport::useAuthCodeModel(PassportAuthCode::class);
Passport::usePersonalAccessClientModel(PassportPersonalAccessClient::class);