Laravel 8使用Fortify的多重身份验证保护,但无法实现忘记密码和验证管理员的电子邮件



我用自定义视图实现了Fortify Multi-Auth Guard(管理员和用户(。我有管理员和用户的独立登录视图。我还为用户实现了忘记密码,它运行得很好。我只是无法实现忘记管理员密码。此外,我还想为管理员和用户实现电子邮件验证。我找到了一半的解决方案请允许我解释一下:-

vendor/laravel/framework/src/alight/Auth/Passwords/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' => AppModelsUser::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => AppModelsAdmin::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,
];

config/foundation.php

<?php
use AppProvidersRouteServiceProvider;
use LaravelFortifyFeatures;
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,
]),
],
];

我实现了这一点,但对于Tenancy,但一旦我处理了这两个不同的保护,想法就一样了。在auth.php中类似,但添加到"默认值">

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

其余的是auth和defense文件的相同配置。在我的情况下,当处理租户或主应用程序用户时,我可以通过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]));
}

在您的情况下,您必须找到方法将一些标志传递给broker,让您管理它,或者如果可以在PasswordResetLinkController的broker方法中管理它,则进行更多的研究。这里有一个存储方法,你可以检查用户的请求是否是admin,并为每种情况提供所需的brocker

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

最新更新