、实现思路

1、实现思路

通过给用户注册邮箱发送包含特定令牌的重置密码链接,然后用户登录邮箱通过访问该重置密码链接实现密码的重置。

2、数据表&模型

实现CanResetPasswordContract契约并使用CanResetPasswordtrait的User模型(Laravel自带) 用于存放重置密码令牌的表password_resets(Laravel自带该表对应迁移文件,上一节中已一并创建)

3、创建路由

Laravel自带了用于密码重置的控制器Auth\PasswordController,和上一节提到的AuthController位于统一目录下。重置密码相关的业务逻辑都是通过该控制器中使用的ResetsPasswordstrait来实现的。下面我们在routes.php中为重置密码定义相关路由规则:

// 发送密码重置链接路由 Route::get(‘password/email‘, ‘Auth\[email protected]‘); Route::post(‘password/email‘, ‘Auth\[email protected]‘);

// 密码重置路由 Route::get(‘password/reset/{token}‘, ‘Auth\[email protected]‘); Route::post(‘password/reset‘, ‘Auth\[email protected]‘);

4、创建视图

定义好路由之后我们为get请求定义对应视图文件,首先创建发送密码重置链接路由对应视图resources/views/auth/password.blade.php:

<form method="POST" action="/password/email"> {!! csrf_field() !!}

<div> Email <input type="email" name="email" value="{{ old(‘email‘) }}"> </div>

<div> <button type="submit"> 发送密码重置链接 </button> </div> </form> 然后创建重置密码路由对应视图resources/views/auth/reset.blade.php:

<form method="POST" action="/password/reset"> {!! csrf_field() !!} <input type="hidden" name="token" value="{{ $token }}">

<div> Email:<input type="email" name="email" value="{{ old(‘email‘) }}"> </div>

<div> 新密码:<input type="password" name="password"> </div>

<div> 确认密码:<input type="password" name="password_confirmation"> </div>

<div> <button type="submit"> 重置密码 </button> </div> </form> 此外我们还要创建一个额外视图——发送密码重置链接的邮件模板视图resources/views/emails/password.blade.php,用于为该邮件提供视图模板:

点击这里重置密码: {{ url(‘password/reset/‘.$token) }} 如果该邮件模板视图文件路径位于其他地方,不要忘了配置config/auth.php中的password.email值与新路径对应。

5、发送邮件配置

接下来我们要做的是配置相关文件实现邮件发送功能为下一步测试做准备。

Laravel使用SwiftMailer库提供的邮件API实现邮件操作,详情可查看邮件文档,这里我们仅作简单配置实现邮件发送,邮件配置文件是config/mail.php:

<?php

return [ ‘driver‘ => env(‘MAIL_DRIVER‘, ‘smtp‘), ‘host‘ => env(‘MAIL_HOST‘, ‘smtp.mailgun.org‘), ‘port‘ => env(‘MAIL_PORT‘, 587), ‘from‘ => [‘address‘ => null, ‘name‘ => null], ‘encryption‘ => env(‘MAIL_ENCRYPTION‘, ‘tls‘), ‘username‘ => env(‘MAIL_USERNAME‘), ‘password‘ => env(‘MAIL_PASSWORD‘), ‘sendmail‘ => ‘/usr/sbin/sendmail -bs‘, ‘pretend‘ => false, ];

可见大部分配置在.env文件中设置,这里我的.env文件配置如下:

MAIL_DRIVER=smtp MAIL_HOST=smtp.163.com MAIL_PORT=25 [email protected] MAIL_PASSWORD=mypassword MAIL_ENCRYPTION=null

我使用的是163邮箱,其它邮箱参考对应邮箱相关设置项,并将自己的账户信息填写到MAIL_USERNAME和MAIL_PASSWORD。

此外我们还要配置mail.php中的from配置如下:

‘from‘ => [‘address‘ => ‘[email protected] ‘, ‘name‘ => ‘Laravel学院‘], 这里只需要将address和.env文件中的MAIL_USERNAME值相匹配即可。至于name值就是邮箱中发件人名称,可自定义。

做好这一步配置后,接下来即可测试密码重置了。

6、重置密码

在浏览器中访问http://laravel.app:8000/password/email,页面显示如下:

Laravel 发送重置密码邮件

在Email输入框中填写你的注册邮箱,点击“发送密码重置链接”,然后去邮箱中查看收件箱,如果发送成功,可收到一封内容如下的密码重置邮件:

点击这里重置密码:

ttp://laravel.app:8000/password/reset/96c652e4885591c7ecfcb4f1ecc6f9b877ac1a2ab445e7fb45a89fdfc7283585 此时数据表password_resets中也新增了一条记录,用于保存重置链接令牌:

Laravel保存重置密码token

该令牌默认保存一个小时,要修有效期,可通过编辑config/auth.php中password.expire来实现。

我们将重置密码邮件中的链接拷贝出来粘贴到浏览器地址栏回车,页面显示内容如下:

Laravel重置密码页面

填写该表单后点击重置密码按钮即可完成密码重置。

密码重置成功后,默认跳转链接为/home,我们可以在PasswordController中通过设置$redirectTo/$redirectPath属性的值修改该跳转链接:

protected $redirectPath = ‘/profile‘;

这样重置成功后会跳转到http://laravel.app:8000/profile:

test登录成功!

同时password_resets中的对应记录也会被删除。

好了,下次登录就可以使用新密码进行登录认证了。

时间: 2024-12-07 01:54:23

、实现思路的相关文章

linux开机获取不到IP排查思路

最近发现linux主机重启老是获取不到IP,每次都要手动dhclient eth0一下,很麻烦. 想了下,可能有问题 于是乎,就有这个排查思路: 1.查看开机时是否将网卡连接上来: 2.在虚拟机内使用命令查看,是否开机启动network服务,主要看3,5两个级别,最好开启: 3. 另外还需要看下网卡配置文件,是否配置正确,主要看 ONBOOT:开机启动网卡.这一项要是yes BOOTPROTO:网络分配方式,静态,这里需要小写,例如dhcp(dhcp自动获取),static(以静态IP方式存在)

《好好说话》:常见沟通场景的应对误区与应答思路、应答句式。4星。

全书针对谈话的常见场景,分析双方的本质问题和应答方的常见应对误区.应该的应答思路与句式.对沟通双方的思路的分析比较有功力. 感觉是从大专辩论赛的角度来组织全书的结构的.我更同意马东在序言中的说法,这本书更应该叫<好好思考>.不过如果从“好好思考”的角度来写书,全书的结构和重点要做一些变化. 书中把语言沟通的五种常见场景(沟通.说服.谈判.演讲.辩论)称作五个维度,还画了一个五边形,我认为这是全书最大的败笔,这里说“五种场景”比“五个维度”跟合适,用表格比用五边形更合适. 个人感觉:在大部分的场

Nginx+PHP (Fastcgi)常见502和504解决思路分享

公司一台测试服务器,最近出现504和502问题:(环境LNMP,php编译安装,Fastcgi模式),问题不难解决,但这里分享一下自己的排查思路和处理问题的方式. 504 Gateway Time-out,nginx 502 bad gateway 一.分析问题: Nginx 504 Gateway Time-out的含义是没有请求到可以执行的PHP-CGI. Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于读取资源的等没有执行完毕而导致PHP-CGI进程

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

五子棋计算思路

五子棋分为有禁手和无禁手,有禁手就是在无禁手的规则的基础上加上禁手规则,具体是规则不讲了.所以就人机对战来讲,从无禁手来做,比较好做.这里只讲无禁手的情况.无禁手就是只要能连成5个子,或者5个子以上,就算赢.    而计算机博弈要解决的问题,抽象地讲只有一个问题“下一步怎么走”,对五子棋来讲,就是下一步在哪个点落子.一般的思路在 棋类人机对战的一般原理 - BillySir - 博客园  已经有说.下面重点讲五子棋特有的算法思路. 下一步怎么走,总体思路:    1.如果下一步能赢,就走这一步 

Web 开发后端缓存思路

数据写入缓存: 在数据库与服务端之间利用 redis 这是一个很常见的场景.比如文章的浏览数,每次文章被浏览时,浏览数都 +1.如果每次都回写数据库,不免数据量太大.加上数据库看似简单,其实做了不少关于一致性(请看官了解一下所谓[一致性],[base],[acid])的检查. 而同时,浏览数并不要求保证一致性,只要大概准确就行了. 所以这时候,我们可以先将浏览数写入 redis,满足一定条件后,再回写数据库. 比如,在 controller 中,让每次浏览都在 redis 上 +1,+1 完成后

使用RNN解决NLP中序列标注问题的通用优化思路

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 序列标注问题应该说是自然语言处理中最常见的问题,而且很可能是最而没有之一.在深度学习没有广泛渗透到各个应用领域之前,传统的最常用的解决序列标注问题的方案是最大熵.CRF等模型,尤其是CRF,基本是最主流的方法.随着深度学习的不断探索和发展,很可能RNN模型会取代CRF的传统霸主地位,会成为解决序列标注问题的标配解决方案. 本文主要抽象出利用RNN解决序列标注问题的通用优化思路.这个RNN优化思路应该

政府采购电子办公系统总结-思路篇

前言 政府采购电子办公系统是实现招标,投标,评标等过程的电子化管理.在这个系统中我所负责的是招标文件制作和档案管理.这篇文章里我主要介绍一下对于这两部分业务的实现思路. 招标文件制作 实现思路 提炼出招标文件中相对来说容易变化的内容,这些内容因不同的招标项目而异.如:招标项目名称,采购单位,招标开始日期等.这些信息做成表单由用户来填写. 制作一个招标文件模板,在出现上述可变内容的地方写成"{}". 在生成招标文件时获得用户的信息,利用Aspose.Word替换上述模板中的"{

头像服务端设计思路

思路 一 把图片上传到服务端.命名以用户的(用户名md5)作为文件名.要是以前有文件,覆盖以前的文件 二编写一个servlet处理获取头像请求. servlet接收一个用户名md5+大小的参数 根据 用户名md5+大小生成对应的图片 例如 用户名为ada 上传到服务端的位置为 /gravatar/ada.jpg 请求地址:/webstore/headimg/ada.jpg?s=120 对应的服务端文件地址 /gravatar/ada.jpg(原图片) /gravatar/ada/120.jpg

关于Spring JDBC RowMapper的一点改进思路

[注]通常我们使用RowMapper(比如ParameterizedRowMapper),都需要定义好查询字段,如果使用别名就没办法了.还要比如加入group,或者联合查询,也不能够使用,除非不想要非主体Bean之外的字段,那么只能用Map接收返回结果了,或者直接实现RowMapper.基于这一点,提出一个稍微通用的解决思路:所有的Bean都继承一个基类Bean,里面放一个Map(就是存放那些Bean没有指定的字段了,比如sum.count.avg - 各种查询字段或者别名),参考BeanPro