问题描述
我使用自定义视图实现了 Fortify Multi Auth Guard(管理员和用户)。我有单独的管理员和用户登录视图。我还为用户实现了忘记密码,并且运行良好。我只是无法为管理员实施忘记密码。此外,我还想为管理员和用户实施电子邮件验证。 我找到了一半的解决方案请允许我解释一下:-
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]));
}
public function broker($name = null)
{
$name = $name ?: $this->getDefaultDriver();
return $this->brokers[$name[1]] ?? ($this->brokers[$name[1]] = $this->resolve($name[1]));
}
它如何根据要求对两者起作用?覆盖提到的 broker() 方法的最佳方法是什么?
<?PHP
return [
'defaults' => [
'guard' => 'web','passwords' => 'users',],'guards' => [
'web' => [
'driver' => 'session','provider' => 'users','admin' => [
'driver' => 'session','provider' => 'admins','api' => [
'driver' => 'token','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','password_timeout' => 10800,];
<?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,]),];
解决方法
我为 Tenancy 实现了这个,但是一旦我处理了这 2 个差异保护,这个想法是一样的。在 auth.php 中类似但添加到 'defaults'
'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 的代理方法中管理它,则进行更多研究。这里你有 store 方法,你可以检查用户的请求是否是管理员,并为每个案例提供你需要的经纪人
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()));
//......