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()));
//......