Laravel 8 Multi Auth Guard 使用 Fortify 但无法为管理员实现忘记密码和验证电子邮件

问题描述

我使用自定义视图实现了 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() 方法的最佳方法是什么?

config/auth.PHP

<?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,];

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,]),];

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...