Laravel 8 Multi Auth Guard использует Fortify, но не может реализовать забытый пароль и проверить электронную почту для администратора

Я реализовал Fortify Multi Auth Guard (Admin и User) с настраиваемым представлением. У меня есть отдельный вид входа для администратора и пользователя. Я также реализовал забытый пароль для пользователя, и он работает очень хорошо. Я просто не могу реализовать забытый пароль для администратора. Кроме того, я также хочу реализовать проверку электронной почты как для администратора, так и для пользователя. Я нашел половину решения. Позвольте мне объяснить: -

поставщик / laravel / framework / src / подсветка / Auth / пароли / PasswordBrokerManager.php

      public function broker($name = null)
{
    $name = $name ?: $this->getDefaultDriver();
    return $this->brokers[$name] ?? ($this->brokers[$name] = $this->resolve($name));
}

Если я изменю вышеуказанный метод, как показано ниже, он будет работать только для пользователя

      public function broker($name = null)
{
    $name = $name ?: $this->getDefaultDriver();
    return $this->brokers[$name[0]] ?? ($this->brokers[$name[0]] = $this->resolve($name[0]));
}

И если я изменю метод, как показано ниже, он будет работать только для администратора

      public function broker($name = null)
{
    $name = $name ?: $this->getDefaultDriver();
    return $this->brokers[$name[1]] ?? ($this->brokers[$name[1]] = $this->resolve($name[1]));
}

Как это будет работать для обоих в соответствии с требованиями? Как лучше всего переопределить упомянутый метод broker()?

config / auth.php

      <?php

return [


    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],


    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],


    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],


    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
        
        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],


    'password_timeout' => 10800,

];

конфигурация / fortify.php

      <?php

use App\Providers\RouteServiceProvider;
use Laravel\Fortify\Features;

return [

    'guard' => 'web',

    'passwords' => ['users', 'admins'],

    'username' => 'email',

    'email' => 'email',

    'home' => RouteServiceProvider::HOME,

    'prefix' => '',

    'domain' => null,

    'middleware' => ['web'],

    'limiters' => [
        'login' => 'login',
        'two-factor' => 'two-factor',
    ],

    'views' => true,

    'features' => [
        Features::registration(),
        Features::resetPasswords(),
        // Features::emailVerification(),
        Features::updateProfileInformation(),
        Features::updatePasswords(),
        Features::twoFactorAuthentication([
            'confirmPassword' => true,
        ]),
    ],

];

1 ответ

Я реализовал это, но для Tenancy, но идея та же самая, когда я возьму на себя эти 2 защиты от различий. В auth.php аналогично, но добавить к «значениям по умолчанию»

      'defaults' => [
        'guard' => 'web',
        'passwords' => ['users','tenant'],  // in your case must be ['users','admins']
    ],

остальное - это та же конфигурация для файлов аутентификации и укрепления. В моем случае я могу идентифицировать с помощью пакета Tenancy, когда обрабатываю клиента или основного пользователя приложения, тогда я делаю

      public function broker($name = null)
{
   $name = $name ?: $this->getDefaultDriver();
   if (Tenancy::getTenant()) {
      return $this->brokers[$name[1]] ?? ($this->brokers[$name[1]] = $this->resolve($name[1]));
   }
   else
      return $this->brokers[$name[0]] ?? ($this->brokers[$name[0]] = $this->resolve($name[0]));
}

В вашем случае вам нужно найти способ передать брокеру какой-либо флаг, который позволит вам управлять этим, или провести дополнительное исследование, если это возможно, в методе брокера PasswordResetLinkController. Здесь у вас есть метод магазина, с помощью которого вы можете проверить, является ли запрос пользователя администратором или нет, и предоставить брокеру, который вам нужен для каждого случая.

      public function store(Request $request): Responsable
{
   $request->validate([Fortify::email() => 'required|email']);
       //see if here you can get the user through email credentials

   // We will send the password reset link to this user. Once we have attempted
   // to send the link, we will examine the response then see the message we
   // need to show to the user. Finally, we'll send out a proper response.
   $status = $this->broker()->sendResetLink($request->only(Fortify::email()));
  //......

Другие вопросы по тегам