laravel 邮箱认证
修改 User 模型,将 Laravel 自带的邮箱认证功能集成到我们的程序中
<?php namespace App\Models; use Illuminate\Notifications\Notifiable;
use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract; class User extends Authenticatable implements MustVerifyEmailContract
{
use Notifiable, MustVerifyEmailTrait; /**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
]; /**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
]; /**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}
代码详解:
加载使用 MustVerifyEmail
trait,打开 vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php
文件,可以看到以下三个方法:
hasVerifiedEmail()
检测用户 Email 是否已认证;markEmailAsVerified()
将用户标示为已认证;sendEmailVerificationNotification()
发送 Email 认证的消息通知,触发邮件的发送。
得益于 PHP 的 trait 功能,User 模型在 use
以后,即可使用以上三个方法。
可以打开 vendor/laravel/framework/src/Illuminate/Contracts/Auth/MustVerifyEmail.php
,可以看到此文件为 PHP 的接口类,继承此类将确保 User 遵守契约,拥有上面提到的三个方法。
如果我们使用了 Laravel 自带的 RegisterController
,控制器通过加载 Illuminate\Foundation\Auth\RegistersUsers
trait 来引入框架的注册功能,此时我们打开此 trait 来翻阅源码并定位到 register(Request $request)
方法:
此方法处理了用户提交表单后的逻辑,我们把重点放在 event(new Registered($user = $this->create($request->all())));
,这里使用了 Laravel 的事件系统,触发了 Registered
事件。
打开 app/Providers/EventServiceProvider.php
文件,此文件的 $listen
属性里我们可以看到注册了Registered
事件的监听器:
打开 SendEmailVerificationNotification
类,阅读其源码:
vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php
可以看出 Laravel 默认已经为我们设置了邮件发送的逻辑
强制用户认证
我们希望用户认证邮箱后,才能使用网站。
我们将使用 Laravel 中间件 来过滤用户的所有请求,如果用户未认证的话,就跳转到邮件认证提醒的页面中
可以使用以下命令来新建一个中间件:
php artisan make:middleware EnsureEmailIsVerified
打开生成的文件并代入以下内容:
app/Http/Middleware/EnsureEmailIsVerified.php
<?php namespace App\Http\Middleware; use Closure; class EnsureEmailIsVerified
{
public function handle($request, Closure $next)
{
// 三个判断:
// 1. 如果用户已经登录
// 2. 并且还未认证 Email
// 3. 并且访问的不是 email 验证相关 URL 或者退出的 URL。
if ($request->user() &&
! $request->user()->hasVerifiedEmail() &&
! $request->is('email/*', 'logout')) { // 根据客户端返回对应的内容
return $request->expectsJson()
? abort(403, 'Your email address is not verified.')
: redirect()->route('verification.notice');
} return $next($request);
}
}
接下来注册中间件,注册的时机确保在 StartSession
后面即可:
app/Http/Kernel.php
此时如果我们没有认证邮箱就会看到认证提醒,并且除了我们上面代码中设置的 URL 外都会进入此页面:
内置邮箱认证还有个小功能,当你点击点击多次『重新发送 Email』后,系统会自动做限额处理,可以有效防止用户消耗太多资源。你可以在 VerificationController
中配置相应的信息:
laravel 邮箱认证的更多相关文章
- Laravel用户认证
前期准备 Laravel的权限配置文件位于 config/auth.php,Laravel的认证组件由"guards"和"providers"组成, Guard ...
- Laravel Passport认证-多表、多字段解决方案
Laravel Passport认证-多表.多字段解决方案 2018年08月19日 09:31:01 醉卧码场君莫笑 阅读数:1632 1. 概述 API 通常使用令牌(token)进行认证并且在 ...
- Laravel用户认证系统的实现细节
原文地址:http://www.php.cn/php-weizijiaocheng-406076.html 这篇文章主要介绍了关于Laravel用户认证系统的实现细节,有着一定的参考价值,现在分享给大 ...
- Laravel -- 邮箱功能配置问题
```` 今天碰到了这块的问题,还是记一下 ```` 关于邮箱: 品牌:腾讯qq.网易163 等 种类:个人.企业 邮箱服务器种类 配置教程 https://jingyan.baidu.com/art ...
- Spring Boot笔记(七) springboot 集成 JavaMail 实现邮箱认证
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JavaMail 1.什么是JavaMail? JavaMail,顾名思义,提供给开发者处理 电子邮 ...
- discuz x2.5用户注册后邮箱认证后无法收到邮件或者直接进垃圾箱
又是一个周末,jquery特效继续折腾我那discuz论坛,我开启了个邮箱验证,恶意注册的太恶心了,没有办法. 能稍微屏蔽点,但是问题来了,据亲们反应,无法收到验证邮件,或者有时间直接进入垃圾箱,这个 ...
- laravel 用户认证简单示例
一.模型代码: 实现接口:\Illuminate\Contracts\Auth\Authenticatable 并引入trait:\Illuminate\Auth\Authenticatable &l ...
- laravel 邮箱改密功能
参考网址: http://laravelacademy.org/post/1290.html
- laravel 的用户认证
1.简介 Laravel 中实现用户认证非常简单.实际上,几乎所有东西都已经为你配置好了.配置文件位于config/auth.php,其中包含了用于调整认证服务行为的.文档友好的选项配置. 在底层代码 ...
随机推荐
- Mysql数据多表查询及pymysql的使用
Exists关键字表示存在,在使用exists关键字时,内增查询语句不返回查询记录,而是返回一个真假值,True或者False,返回True外层语句才会进行查询:返回False时,外层查询语句不会进行 ...
- python之路之课后作业
以下代码只包含管理员代码,用户代码和管理员相似 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os sys.path. ...
- 实现排行榜神器——redis zset
需求:假如现在需要搞个 “运动消耗卡路里排行榜”,例似微信步数排名,显示排名前20人的信息和消耗的卡里路,怎样实现排序? 一般思路:存储信息,然后数据库查询,排序?(假如有几十万人参与排名,这样查my ...
- 微信或QQ屏蔽了我的域名,已经被微信屏蔽的域名如何在微信打开,如何进行微信域名防封?
微信域名完全防封是绝对不可能的,这是必须明确的,曾经有人打折<不死域名>的概念,它不是不死,是稍微命长一点,在推广上成本更低一下,效果更好一些, 主要的技术原理是利用了腾讯云的域名安全联盟 ...
- Linux基础命令小结(超全!!)
Linux目录结构 1.bin 存放经常使用的指令比如ll,cp 2.sbin 系统管理员使用的系统管理指令 3.home 存放普通用户的住目录 4.root 系统管理员的用户主目录 5.boot 存 ...
- bzoj 2049: [Sdoi]Cave 洞穴探测 (LCT)
第一次写lct (这是一道lct裸题 这次没有可爱(划掉)的同学教我,虽然有模板,但是配合网上的讲解还是看不懂QAQ 然后做了几道题之后总算有些感觉辣 于是决定给自己挖个坑,近期写一个lct详解(不过 ...
- 图的最短路径算法Dijkstra算法模板
Dijkstra算法:伪代码 //G为图,一般设为全局变量,数组d[u]为原点到达个点的额最短路径, s为起点 Dijkstra(G, d[u], s){ 初始化: for (循环n次){ u = 是 ...
- wamp使用时遇到的问题总结
1.相关网页无法访问? 解决方案:修改配置文件,将所有的Deny from all 改为Allow from all,再重启wamp 以下列举配置文件 local host无法访问 单击wamp图标, ...
- (DFS)HDU_1241 Oil Deposits
HDU_1241 Oil Deposits Problem Description The GeoSurvComp geologic survey company is responsible f ...
- 实现手写体 mnist 数据集的识别任务
实现手写体 mnist 数据集的识别任务,共分为三个模块文件,分别是描述网络结构的前向传播过程文件(mnist_forward.py). 描述网络参数优化方法的反向传播 过 程 文件 ( mnist_ ...