首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 8多个8月警卫使用Fortify,但无法实现忘记密码和验证管理员的电子邮件

Laravel 8多个8月警卫使用Fortify,但无法实现忘记密码和验证管理员的电子邮件
EN

Stack Overflow用户
提问于 2021-05-25 09:37:24
回答 1查看 1.9K关注 0票数 0

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

vendor/laravel/framework/src/illuminate/Auth/Passwords/PasswordBrokerManager.php

代码语言:javascript
复制
public function broker($name = null)
{
    $name = $name ?: $this->getDefaultDriver();
    return $this->brokers[$name] ?? ($this->brokers[$name] = $this->resolve($name));
}

如果我按下面的方式修改上面的方法,它只对用户有效。

代码语言:javascript
复制
public function broker($name = null)
{
    $name = $name ?: $this->getDefaultDriver();
    return $this->brokers[$name[0]] ?? ($this->brokers[$name[0]] = $this->resolve($name[0]));
}

如果我按下面的方式修改该方法,它只对admin有效。

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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,
        ]),
    ],

];
EN

回答 1

Stack Overflow用户

发布于 2021-05-25 22:12:45

我实现这一点,但租赁,但想法是相同的,一旦我处理这两个不同的卫士。在类似的auth.php中,但是添加了“默认值”

代码语言:javascript
复制
'defaults' => [
        'guard' => 'web',
        'passwords' => ['users','tenant'],  // in your case must be ['users','admins']
    ],

其余的配置对于两个文件,auth和fortify都是相同的配置。在我的例子中,我可以在处理租户或主要应用程序用户时通过租赁包来识别,然后我就可以了。

代码语言:javascript
复制
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

代码语言:javascript
复制
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()));
  //......
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67685379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档