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

时间:2018-01-05 19:14:45

标签: php laravel authentication laravel-5 laravel-5.4

在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;
        }

此方法是否可以检查单独的表格或使用单独的身份验证保护?

4 个答案:

答案 0 :(得分:7)

以下是我如何向密码发送密码重置链接的方法,这是多auth系统的一部分。

我将假设您已在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
}

注意:这不是实施密码重置保护的唯一步骤,您将不得不采取其他步骤,如创建新路由,通知,表单和相应的观点。

答案 1 :(得分:2)

在auth.php配置文件中,您可以配置多个" guards",它们可用于为多个用户表定义身份验证行为。您可以通过覆盖控制器上的保护方法来自定义包含的ResetPasswordController以使用您选择的保护。此方法应返回一个保护实例:

protected function guard()
{
    return Auth::guard('guard-name');
}

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

protected function broker()
{

    return Password::broker('name');
}

答案 2 :(得分:0)

我假设你在谈论用户提供商而不是警卫。至少在您的配置文件中,您更改了提供程序(公司)并保留了默认保护(会话)。

如果提供者和后卫之间的区别仍然模糊,那么可以在文档中找到很好的解释right here

  

Laravel的认证设施的核心是   “警卫”和“提供者”。警卫定义用户的身份验证方式   对于每个请求,Laravel附带一个会话保护,使用会话存储和cookie维护状态。

     

提供商定义如何从持久存储中检索用户。

如果您的自定义用户提供商未启动,请检查其是否已正确注册。

步骤1.在./config/auth.php中找到“提供者”注册。在您的情况下,“提供者”应该是提供者'公司',即:

'providers' => [
    'companies' => [
         'driver' => 'customprovidername',
         /* ... other needed conf parameters for custom provider ...*/
    ]
    /*... other available providers ...*/
],

customprovider 名称是您选择的任何名称,它只不过是在系统中注册自定义提供程序时用作 Auth :: provider 中第一个参数的名称。它甚至可能是公司。如果它是 eloquent 那么你肯定仍在使用Laravel的提供者,而不是你的自定义提供者,并且你的错误。

步骤2.找到注册了名为 customprovidername 的用户提供程序的位置。通常是在位于./app/Providers/AuthServiceProvider.php的服务提供商中注册。搜索“_ Auth :: provider('customprovidername',[/ * ...您的自定义提供程序... * /]”_

步骤3.确认 / * ...您的自定义提供程序... * / 代码将注册您的自定义提供程序,而不是某些copy-past再次初始化默认的Eloquent提供程序。< / p>

有关注册自定义提供商的更多信息,请访问here

答案 3 :(得分:0)

一个pakage怎么样...我使用了以下的包,它对我来说非常适合laravel 5.4 ...你可以根据需要为多个表设置完整的auth ......

https://github.com/Hesto/multi-auth

相关问题