密码重设

密码重设的步骤

  1. 用户点击重设密码链接并跳转到重设密码页面;
  2. 在重设密码页面输入邮箱信息并提交;
  3. 控制器通过该邮箱查找到指定用户并为该用户生成一个密码令牌,接着将该令牌以链接的形式发送到用户提交的邮箱上;
  4. 用户查看自己个人邮箱,点击重置密码链接跳转到重置密码页面;
  5. 用户在该页面输入自己的邮箱和密码并提交;
  6. 控制器对用户的邮箱和密码重置令牌进行匹配,匹配成功则更新用户密码;

保存密码重置令牌的数据表

在密码重设功能中,我们还会用到一个用来保存密码重置令牌的数据表,Laravel 已默认为我们生成好了该数据表。

database/migrations/2014_10_12_100000_create_password_resets_table.php

可以看到 Laravel 默认生成的密码重置表有三个字段 email, token, created_at,分别用于生成用户邮箱、密码重置令牌、密码重置令牌的创建时间,并为邮箱和密码重置令牌加上了索引,这样在数据库使用这两个字段进行查找时效率更快。

由于我们在前面已经执行过了迁移,因此现在我们的数据库已经拥有了 password_resets 表,无需再次运行迁移生成。

密码重设控制器

Laravel 将密码重设功能相关的逻辑代码都放在了 ForgotPasswordController 和 ResetPasswordController 中,因此我们接下来需要将重设密码相关的路由指定到该控制器上。

routes/web.php

name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');

该路由列表的信息如下所示:

HTTP请求 URL 动作 作用
GET /password/reset Auth\ForgotPasswordController @showLinkRequestForm 显示重置密码的邮箱发送页面
POST /password/email Auth\ForgotPasswordController @sendResetLinkEmail 邮箱发送重设链接
GET /password/reset/{token} Auth\ResetPasswordController @showResetForm 密码更新页面
POST /password/reset Auth\ResetPasswordController @reset 执行密码更新操作

现在路由已配置完成,由于 Laravel 在 ForgotPasswordController 和 ResetPasswordController 中已经为我们处理好一些相关逻辑,因此我们现在只需要将精力专注于视图的构建就行了。

相关视图

修改用户的登录页面,添加修改密码的链接。

resources/views/sessions/create.blade.php

@extends('layouts.default')
@section('title', '登录')

@section('content')
登录
@include('shared._errors')
{{ csrf_field() }}

还没账号?现在注册!

@stop

重置密码表单

Laravel 生成的密码控制器在 getEmail 动作中返回的视图为 auth.passwords.email,因此让我们新建该视图,并在里面加上用户重置密码的表单。

resources/views/auth/passwords/email.blade.php

@extends('layouts.default')
@section('title', '重置密码')

@section('content')
重置密码
@if (session('status'))
{{ session('status') }}
@endif
{{ csrf_field() }}
@if ($errors->has('email')) {{ $errors->first('email') }} @endif
@endsection

getReset 动作对应的 auth.passwords.reset 视图构建如下。

resources/views/auth/passwords/reset.blade.php

@extends('layouts.default')
@section('title', '更新密码')

@section('content')
更新密码
@if (session('status'))
{{ session('status') }}
@endif
{{ csrf_field() }}
@if ($errors->has('email')) {{ $errors->first('email') }} @endif
@if ($errors->has('password')) {{ $errors->first('password') }} @endif
@if ($errors->has('password_confirmation')) {{ $errors->first('password_confirmation') }} @endif
@endsection

修改重定向地址

Laravel 在 ResetPasswordController 中默认为我们设置好了密码重置成功后的重定向地址 /home,而由于我们在本项目中并没有为 /home 绑定任何控制器动作,因此我们需要对 ResetPasswordController 的 $redirectPath 属性进行修改,将默认重定向地址改为 /,改动后的 ResetPasswordController 如下:

app/Http/Controllers/Auth/ResetPasswordController.php

middleware('guest');
    }
}

定制 Laravel 密码重置邮件功能

生成消息通知文件

$ php artisan make:notification ResetPassword

以上命令会生成 app/Notifications/ResetPassword.php 文件;

定制消息通知文件

app/Notifications/ResetPassword.php

token = $token;
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->line('这是一封密码重置邮件,如果是您本人操作,请点击以下按钮继续:')
            ->action('重置密码', url(config('app.url').route('password.reset', $this->token, false)))
            ->line('如果您并没有执行此操作,您可以选择忽略此邮件。');
    }
}

User 模型里调用通知

app/Models/User.php

notify(new ResetPassword($token));
    }
}

发布密码重置的 Email 视图

$ php artisan vendor:publish --tag=laravel-notifications

发布的文件为 resources/views/vendor/notifications/email.blade.php ,这里我们先不做修改。

尝试邮箱找回密码功能

点忘记密码开始测试,在 storage/logs/laravel.log 文件中打开重置密码链接……

你可能感兴趣的:(密码重设)