我使用自定义视图实现了Fortify多个Auth警卫(管理和用户)。我有单独的管理和用户登录视图。我还为用户实现了忘记密码,它运行得很好。我只是无法为管理实现忘记密码。此外,我还想为管理员和用户实现电子邮件验证。我找到了一半的解决办法,请允许我解释:-
vendor/laravel/framework/src/illuminate/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]));
}如果我按下面的方式修改该方法,它只对admin有效。
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,
];config/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,
]),
],
];发布于 2021-05-25 22:12:45
我实现这一点,但租赁,但想法是相同的,一旦我处理这两个不同的卫士。在类似的auth.php中,但是添加了“默认值”
'defaults' => [
'guard' => 'web',
'passwords' => ['users','tenant'], // in your case must be ['users','admins']
],其余的配置对于两个文件,auth和fortify都是相同的配置。在我的例子中,我可以在处理租户或主要应用程序用户时通过租赁包来识别,然后我就可以了。
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的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()));
//......https://stackoverflow.com/questions/67685379
复制相似问题