Laravel-5.8学习

用Laravel框架自带的邮件发送机制实现登录注册认证。

前言

Web应用开发课上的实验,之前实验2的时候是自己写php代码实现登录、注册、密码找回功能(不用邮箱验证),当时还自己看了看jquery、bootstrap4、Ajax简单写了写,本来也打算搬到这个博客上来,但是过了一两个礼拜,忘记自己当时是怎么一步步写的了,惭愧惭愧。。
所以这次实验3,趁刚做完,赶紧来记录一下


Laravel基础

这次实验我也只是对Laravel快速过了一下,是看的它的中文文档,贴在下面了。
Laravel 5.8中文文档

下面说下这个文档咋用,先是进行Laravel安装,然后用laravel新建一个项目,然后就会生成一系列目录,然后了解下各个目录的作用,都存放写什么东西。
明白各个目录的作用后,理清一下路由、视图、控制器三个的概念,可以写几个简单的路由和控制器和blade视图文件帮助理解,其实按我自己的理解就是路由建立访问路径和处理函数直接的映射,路由可以通过xxxxController@xxxfunction指定控制器,也可以通过view(xxx)指定xxx.blade.php视图文件。视图是回显的前端代码,控制器处理后端操作。(仅为个人理解,错了勿喷)
这些文档里都有,相信比我讲要清楚,所以就不详细写了


对上面的Laravel基础了解过了之后,就可以搞起了,下面就写如何用Laravel自带的邮件发送机制实现登录、注册认证、密码重置功能。(虽然文档里也有,但是文档有些细节没有挑明),因为是先写了实验报告,所以下面就按照实验报告格式写吧。

实验目的和要求

  1. 实验目的:按照前后端混合的开发形式,基于Laravel框架,实现简单和安全的用户注册和登录。
  2. 实验要求:(1)实现Email形式的注册功能和相应的登录功能,注册部分具备邮件激活功能(使用Laravel的邮件发送机制);(2)实现忘记密码时通过重置密码邮件设置新密码(使用Laravel的邮件发送机制);(3)网页内容基于Laravel的Blade模板;(4)在hosts文件里自定义一个域名,实现通过域名来访问;(5)使用路由机制设计访问路径

实验设计思路

因为laravel自带登录认证、邮件发送、密码重置等功能。于是直接调用修改即可。

登录认证功能

使用php artisan make:auth命令生成认证所需要的路由和视图,然后就可以使用/login和/register访问登录和注册页面。这里我通过修改生成的resources\views\layouts\下的app.blade.php视图文件的导航栏部分代码,给导航栏换了背景颜色。

只通过上面php artisan make:auth命令生成路由和视图还不够,我们可以尝试输入信息注册,结果会发现报错,报错原因是因为没有生成数据库里的users这些表。于是我们要在.env文件里面配置选择数据库。如下图是我的配置。

选择好数据库,配置好数据库用户名和密码后,再使用php artisan migrate生成larave登录认证需要的表。如下图,命令执行后,数据库lab中自动生成3张表。

然后再尝试注册和登录功能,发现可以正常执行,输入注册信息后,会直接自动登录,而数据库users表也会插入注册填入的信息。

注册邮箱验证

上一步中实现了登录和注册功能,不过没有实现邮箱认证。所以这一步就来实现邮箱认证。
首先Laravel 也提供了便捷方法来发送和验证邮箱验证请求,我们只需要在app\User.php调用。如下图划红线部分,即为使用代码。

调用了验证邮箱方法后,我们需要对路由进行配置,使其必须通过邮箱验证才能进行登录,而不是填写完注册进行后直接跳转登录。所以我们可以使用路由中间件来限制未验证邮箱用户不能登录或者访问给定路由。routes\web.php里相应代码如下图

实现路由后,我们的网页就具有了邮箱验证功能,但是要实现验证功能的话,必须要发送邮件,邮件模版laravel自带,邮件发送逻辑是在 User 模型类的 sendEmailVerificationNotification 中完成的,无需手动编写,但是发送邮件的邮箱需要我们配置。于是就接着配置邮箱。在.env文件中进行配置,具体可参考https://laravelacademy.org/post/9743.html 进行配置。配置好邮箱后,就能进行认证邮件发送了。

密码重置

跟邮件认证功能一样,密码重置功能laravel框架已经自己内置了,我们要做的就是调用它。所以跟上一步一样,在使用 Laravel 提供的密码重置功能之前,先验证 App\User 模型是不是实现了 Illuminate\Contracts\Auth\CanResetPassword 契约。然后使用 Illuminate\Auth\Passwords\CanResetPassword trait 来包含实现该接口需要的方法。如下图红线代码部分。

因为重置密码的路由和视图在laravel进行php artisan make:auth时已经自动生成了,所以现在可以直接通过/password/reset或者点击登录页面的For got your password?链接进入重置密码页面。如下图

配置Apache虚拟主机和hosts文件

基本的登录、注册认证、密码重置功能都已经实现了,下面就是配置Apache虚拟主机和hosts文件实现自定义域名访问了。
先在Apache的配置文件http.conf文件里开启虚拟主机功能,即找到Virtual hosts选项,将该行下面的# Include conf/extra/httpd-vhosts.conf取消注释。如下图

然后在conf/extra/httpd-vhosts.conf文件里配置虚拟主机。配置完后重启apache。然后再修改hosts文件,使127.0.0.1指向apache定义的虚拟域名。如我的虚拟主机域名为yt.weblab.com

这里配置Apache的虚拟主机容易出现错误,比如定义了虚拟主机后,只能通过虚拟主机访问,而localhost访问失效。或者是能用虚拟主机和localhost访问,但是只能访问到index.php,而其他登录、注册等路径均为404。
我也是踩着坑过来的(2333~),下面就放一下我最终的Apache虚拟主机配置代码吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<VirtualHost *:80>
ServerName localhost # 定义localhos解决定义虚拟主机后localhost无法访问
DocumentRoot "D:\\laragon\\www\\library\\public"

<Directory "D:\\laragon\\www\\library"> # 解决除index.php外其余页面404问题
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "D:\\laragon\\www\\library\\public"
ServerName www.yt.weblab.com
ErrorLog "logs/yt.weblab.com-error.log"
CustomLog "logs/yt.weblab.com-access.log" common

<Directory "D:\\laragon\\www\\library"> # 配置Directory,解决除index.php外其余页面404问题
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>


程序测试

测试一下实验的功能

  1. 先访问登录页面,输入邮箱等信息进行注册。

  2. 点击注册按钮后,页面跳转如下图示,这是resources\views\auth\verify.blade.php视图的显示效果。表明我们的认证邮件已经发送出去。

  3. 接下来我们去我们填入的邮箱里查找验证邮件,发现收取成功,于是点击蓝色按钮进行认证。点击后,成功实现了自动登录

  4. 然后我们测试密码重置功能,进入密码重置页面,输入邮箱,然后点击发送重置密码链接按钮。可以看到,页面出现提示We have e-mailed your password reset link!,表明邮件发送成功

  5. 然后再查看我们的邮箱,发现收到了密码重置邮件

  6. 点击Reset Password按钮,会跳转到下图页面

  7. 在上图重置密码页面输入新密码后,点击重置按钮,即可重置密码。如下图,输入新密码后,会自动登录,同时回显Your password has been reset!提示密码重置成功。

ヾノ≧∀≦)o 来呀!快活呀!~
-------- 本文结束 --------