• <tfoot id='q67VM'></tfoot>

      1. <legend id='q67VM'><style id='q67VM'><dir id='q67VM'><q id='q67VM'></q></dir></style></legend>

          <bdo id='q67VM'></bdo><ul id='q67VM'></ul>
        <i id='q67VM'><tr id='q67VM'><dt id='q67VM'><q id='q67VM'><span id='q67VM'><b id='q67VM'><form id='q67VM'><ins id='q67VM'></ins><ul id='q67VM'></ul><sub id='q67VM'></sub></form><legend id='q67VM'></legend><bdo id='q67VM'><pre id='q67VM'><center id='q67VM'></center></pre></bdo></b><th id='q67VM'></th></span></q></dt></tr></i><div id='q67VM'><tfoot id='q67VM'></tfoot><dl id='q67VM'><fieldset id='q67VM'></fieldset></dl></div>

        <small id='q67VM'></small><noframes id='q67VM'>

        使用 Laravel 5.4 和 Passport 进行多重身份验证

        Multi Auth with Laravel 5.4 and Passport(使用 Laravel 5.4 和 Passport 进行多重身份验证)

        <legend id='EAy8n'><style id='EAy8n'><dir id='EAy8n'><q id='EAy8n'></q></dir></style></legend>

        <small id='EAy8n'></small><noframes id='EAy8n'>

      2. <i id='EAy8n'><tr id='EAy8n'><dt id='EAy8n'><q id='EAy8n'><span id='EAy8n'><b id='EAy8n'><form id='EAy8n'><ins id='EAy8n'></ins><ul id='EAy8n'></ul><sub id='EAy8n'></sub></form><legend id='EAy8n'></legend><bdo id='EAy8n'><pre id='EAy8n'><center id='EAy8n'></center></pre></bdo></b><th id='EAy8n'></th></span></q></dt></tr></i><div id='EAy8n'><tfoot id='EAy8n'></tfoot><dl id='EAy8n'><fieldset id='EAy8n'></fieldset></dl></div>

          • <bdo id='EAy8n'></bdo><ul id='EAy8n'></ul>

              • <tfoot id='EAy8n'></tfoot>

                  <tbody id='EAy8n'></tbody>
                  本文介绍了使用 Laravel 5.4 和 Passport 进行多重身份验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我正在尝试使用 Laravel Passport 设置多重身份验证,但它似乎不支持它.我正在使用密码授予来颁发令牌,这要求我传递想要访问令牌的用户的用户名/密码.

                  I am trying to setup multi auth with Laravel Passport, but it doesn't seem to support it. I am using the Password Grant to issue tokens which requires me to pass username/password of the user wanting access tokens.

                  我设置了 3 个身份验证防护/提供程序,总共 4 个.用户、供应商、管理员和 API

                  I have 3 auth guards/providers setup, 4 in total. Users, Vendors, Admins and API

                  其中 2 个 Auth 需要通行证访问权限,因此每个用户都需要能够颁发令牌.但是 Passport 会自动采用 API 身份验证提供程序,但我希望根据登录的用户进行更改..

                  2 of the Auths need passport access, so each user needs to be able to issue tokens. But Passport automatically takes the API auth provider, but I want this to change based on which user is logging in.. If user does then the User provider and if its a vendor then the Vendor provider.

                  但是 Passport 目前只支持 1 种用户类型,所以默认为 API 提供者.

                  But the way Passport currently only supports only 1 user type, so its defaulting to the API provider.

                  有什么更好的方法吗?或者我应该改用基于角色的身份验证.

                  Is there something better for this? or should I go with roles based authentication instead.

                  推荐答案

                  如果您仍然需要.

                  我更喜欢使用角色,有一个很棒的插件:https://github.com/larapacks/授权

                  I prefer go with roles, there is an amazing plugin for that: https://github.com/larapacks/authorization

                  但如果您有某种需要,您可以按照以下步骤使用.

                  But if you somehow needs that, you will be able to use following the steps bellow.

                  对于多个守卫,您将不得不覆盖一些代码.

                  For multi guards, you will have to overwrite some code.

                  您不是加载 PassportServiceProvider,而是创建自己的并扩展 PassportServiceProvider 并覆盖方法 makePasswordGrant.在此方法中,您将为自己的扩展存储库更改 Passport UserRepository.在用户存储库上,您必须将静态模型配置更改为动态模型配置(我从请求属性加载,但您可以从任何地方获取).

                  Instead of loading PassportServiceProvider, you create your own and extends the PassportServiceProvider and overwrites the method makePasswordGrant. On this method, you will change the Passport UserRepository for your own repository extended. On user repository you must to change the static model config for a dynamic one (I load from request attributes, but you can get from anywhere).

                  您可能需要覆盖其他内容,但我进行了测试并有效.

                  You may have to overwrite something else, but I made a test and works.

                  例如:

                  PassportServiceProvider

                  PassportServiceProvider

                  namespace AppProviders;
                  
                  use LeagueOAuth2ServerAuthorizationServer;
                  use LeagueOAuth2ServerGrantPasswordGrant;
                  use LaravelPassportPassportServiceProvider as BasePassportServiceProvider;
                  use LaravelPassportPassport;
                  
                  class PassportServiceProvider extends BasePassportServiceProvider
                  {
                      /**
                       * Create and configure a Password grant instance.
                       *
                       * @return PasswordGrant
                       */
                      protected function makePasswordGrant()
                      {
                          $grant = new PasswordGrant(
                              $this->app->make(AppRepositoriesPassportUserRepository::class),
                              $this->app->make(LaravelPassportBridgeRefreshTokenRepository::class)
                          );
                  
                          $grant->setRefreshTokenTTL(Passport::refreshTokensExpireIn());
                  
                          return $grant;
                      }
                  
                  }
                  

                  用户存储库

                  namespace AppRepositories;
                  
                  use App;
                  use IlluminateHttpRequest;
                  use LeagueOAuth2ServerEntitiesClientEntityInterface;
                  use LaravelPassportBridgeUserRepository;
                  use LaravelPassportBridgeUser;
                  use RuntimeException;
                  
                  class PassportUserRepository extends UserRepository
                  {
                      /**
                       * {@inheritdoc}
                       */
                      public function getUserEntityByUserCredentials($username, $password, $grantType, ClientEntityInterface $clientEntity)
                      {
                          $guard = App::make(Request::class)->attributes->get('guard') ?: 'api';
                          $provider = config("auth.guards.{$guard}.provider");
                  
                  
                          if (is_null($model = config("auth.providers.{$provider}.model"))) {
                              throw new RuntimeException('Unable to determine user model from configuration.');
                          }
                  
                  
                          if (method_exists($model, 'findForPassport')) {
                              $user = (new $model)->findForPassport($username);
                          } else {
                              $user = (new $model)->where('email', $username)->first();
                          }
                  
                  
                          if (! $user ) {
                              return;
                          } elseif (method_exists($user, 'validateForPassportPasswordGrant')) {
                              if (! $user->validateForPassportPasswordGrant($password)) {
                                  return;
                              }
                          } elseif (! $this->hasher->check($password, $user->password)) {
                              return;
                          }
                  
                          return new User($user->getAuthIdentifier());
                      }
                  }
                  

                  PS:对不起,我的英语不好.

                  PS: Sorry my bad english.

                  这篇关于使用 Laravel 5.4 和 Passport 进行多重身份验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以
                  PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的
                  mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)
                  Laravel Gmail Configuration Error(Laravel Gmail 配置错误)
                  Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)
                  Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)
                  <i id='fTd89'><tr id='fTd89'><dt id='fTd89'><q id='fTd89'><span id='fTd89'><b id='fTd89'><form id='fTd89'><ins id='fTd89'></ins><ul id='fTd89'></ul><sub id='fTd89'></sub></form><legend id='fTd89'></legend><bdo id='fTd89'><pre id='fTd89'><center id='fTd89'></center></pre></bdo></b><th id='fTd89'></th></span></q></dt></tr></i><div id='fTd89'><tfoot id='fTd89'></tfoot><dl id='fTd89'><fieldset id='fTd89'></fieldset></dl></div>

                  <small id='fTd89'></small><noframes id='fTd89'>

                  • <legend id='fTd89'><style id='fTd89'><dir id='fTd89'><q id='fTd89'></q></dir></style></legend>

                        <tfoot id='fTd89'></tfoot>
                          <bdo id='fTd89'></bdo><ul id='fTd89'></ul>

                              <tbody id='fTd89'></tbody>