Laravel 将密码重置链接发送到单独的身份验证保护

Posted

技术标签:

【中文标题】Laravel 将密码重置链接发送到单独的身份验证保护【英文标题】:Laravel send password reset link to a separate authentication guard 【发布时间】:2018-06-15 15:17:37 【问题描述】:

在 Laravel 5.4 中,有没有办法将密码重置链接发送到单独的身份验证保护而不是默认的。我正在使用默认的 PasswordResetController 以这种方式完成工作

 public function company(Request $request)
    
        $this->validate(request(), [
            'email' => 'required|email',
        ]);
        $response = Password::sendResetLink([
            'email' => $request->email
        ]);

        //overridden if condition 
        if($response == "passwords.sent")
        
        return back()->with('message','Password reset link has been sent, please check your email');
        

        return back()->with('message', 'No such email address in our records, try again');
     

sendResetLink() 方法检查并将重置链接发送到默认守卫,但我在 auth.php 中定义了一个名为 web 的新守卫

 'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'companies',
        ],

sendResetLink方法是这样的

  public function sendResetLink(array $credentials)
    
        // First we will check to see if we found a user at the given credentials and
        // if we did not we will redirect back to this current URI with a piece of
        // "flash" data in the session to indicate to the developers the errors.
        $user = $this->getUser($credentials);

        if (is_null($user)) 
            return static::INVALID_USER;
        

此方法有什么方法可以签入单独的表或使用单独的身份验证保护?

【问题讨论】:

你能解释一下你的情况吗?如果没有你介绍的代码,你真的想做什么,因为我想你做错了什么,人们为了帮助解决这个问题而无法正确理解你? 【参考方案1】:

这是我如何将密码重置链接发送给守卫的方法,这是多重身份验证系统的一部分。

我假设你已经在config/auth.php 中正确设置了你的新守卫 这可能看起来像下面的代码:

为了更好地理解,我使用 admin 这个词作为新警卫的名字。

'guards' => [

    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
]

'providers' => [

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],
]


 'passwords' => [

    'admins' => [
        'provider' => 'admins',
        'table' => 'password_resets',
        'expire' => 15,
    ],
]

你必须为你的新警卫创建新的控制器(AdminForgotPasswordControllerAdminResetPasswordController

他们都使用Password门面,AdminResetPasswordController也使用Auth门面。

根据你的新守卫修改构造函数。 所以将它添加到两个控制器中,因为我们有特定类型的访客用户。

public function __construct()

    $this->middleware('guest:admin');

现在我们需要告诉AdminResetPasswordController 使用适当的保护来进行身份验证。

所以将这个方法添加到控制器中

protected function guard()

  return Auth::guard('admin');

现在将这段代码添加到两个控制器中。

protected function broker()

  return Password::broker('admins'); //set password broker name according to guard which you have set in config/auth.php

注意:这不是实施为守卫重置密码的唯一步骤,您还必须采取其他步骤,例如创建新的路线、通知、表单和相应的视图。

【讨论】:

如何在路由中与Password::sendResetLink 一起使用?【参考方案2】:

在你的 auth.php 配置文件中,你可以配置多个“守卫”,可以用来定义多个用户表的认证行为。您可以自定义包含的ResetPasswordController 以通过覆盖控制器上的保护方法来使用您选择的保护。这个方法应该返回一个守卫实例:

protected function guard()

    return Auth::guard('guard-name');

神奇之处在于使用broker - PasswordBroker 为您的自定义保护。但是,请确保在 auth.php 配置文件中设置多个密​​码代理。

protected function broker()


    return Password::broker('name');

【讨论】:

以上是关于Laravel 将密码重置链接发送到单独的身份验证保护的主要内容,如果未能解决你的问题,请参考以下文章

无法在 laravel 5.3 中发送密码重置链接?

Laravel 密码重置链接指向旧的 APP_URL

使用 Laravel Auth 和加密的用户表发送重置链接

Laravel 5.1/AngularJS:在 Angular 视图中重置密码(如何验证 CSRF 令牌?)

Laravel 8 Jetstream如何在重置密码后将用户重定向到自定义路由

Laravel 5 邮箱重置密码