【问题标题】:How To Use Passport In A Multi Tenant Setup In Laravel如何在 Laravel 的多租户设置中使用 Passport
【发布时间】:2019-11-01 19:39:20
【问题描述】:

先决条件:

  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??

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

【问题讨论】:

    标签: laravel multi-tenant laravel-passport


    【解决方案1】:

    首先要做的是创建一个连接到你的租户连接的自定义 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);
    

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 1970-01-01
      • 2018-09-03
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多