「PHP」laravel 项目实现邮箱验证功能

2022-10-11 20:50:13 203 0
魁首哥

邮箱验证功能在很多网站都有用到,我的个人网站上也用到,邮箱验证需要用到邮件发送服务, Laravel 提供了非常简单的邮件发送 API,Laravel 项目实现邮件发送功能很简单,下面我开始介绍一下我的具体实现。

邮箱验证

邮箱验证功能实现具体步骤如下:

  1. 添加字段,为用户表添加两个字段,验证令牌 (verification_token) 和验证状态 (verified) 。
  2. 生成令牌。
  3. 用户登录后,检测是否验证过邮箱,没有则引导去验证。
  4. 使用阿里云企业邮箱发送邮箱验证链接。
  5. 用户点击邮箱验证链接完成验证。

添加字段

使用命令生成迁移文件,命令如下:

$ php artisan make:migration add_verification_to_users_table --table=users
 

命令会在 database/migrations 目录下生成迁移文件 [timestamp]\_add\_verification\_to\_users\_table.php,修改迁移文件,修改后如下:

use Illuminate\Support\Facades\ Schema ;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddVerificationToUsersTable extends Migration
{
 /**
 * Run the migrations.
 *
 * @return void
 */
 public  function  up()
 {
 Schema::table('users', function (Blueprint $table) {
 $table->string('verification_token')->nullable();
 $table->boolean('verified')->default(false);
 });
 }
 /**
 * Reverse the migrations.
 *
 * @return void
 */
 public function down()
 {
 Schema::table('users', function (Blueprint $table) {
 $table->dropColumn('verification_token');
 $table->dropColumn('verified');
 });
 }
 

接着我运行迁移,将字段加入到用户表中。运行命令如下:

php artisan migrate
 

生成令牌

我希望用户注册的时候就给用户生成令牌,所以我在 App 目录下创建 Observers 目录,并在 Observers 目录下创建 UserObserver.php 文件,并编写如下代码:

namespace App\Observers;
use App\Models\Article;
use App\Models\Comment;
use App\Models\Reply;
use App\Models\User;
class UserObserver
{
 public function creating(User $user)
 {
 $user->verification_token=str_random(30);
 }
}
 

在 app/Providers 目录下的 AppServiceProvider.php 文件中 注册监听 Eloquent 事件,代码如下:

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
 /**
 * Bootstrap any application services.
 *
 * @return void
 */
 public function boot()
 {
 \App\Models\User::observe(\App\Observers\UserObserver::class);
 }
 /**
 * Register any application services.
 *
 * @return void
 */
 public function register()
 {
 //
 }
}
 

用户登录后,检测是否验证过邮箱,没有则引导去验证

用户登录后,会检测邮箱是否验证,如果没有验证就会出现邮箱未验证的提示,并引导用户去验证。效果图如下:

个人网站测试网站截图

实现引导的代码如下:

@if(Auth::check() && !Auth::user()->verified&&!Request::is(' email _verification_required'))
 Route ('email-verification-required') }}">重发邮件
@endif

设置路由,修改 routes 目录下 web.php 文件,增加一个路由,代码如下:

Route::get('/email_verification_required', 'UsersController@emailVerificationRequired')->name('email-verification-required');
 

接下来为用户控制器定义一个 emailVerificationRequired 方法,该方法将用于用户点击引导链接进入邮件发送页面,页面效果如下:

个人网站测试网站截图

emailVerificationRequired 方法具体实现代码如下:

app/Http/Controllers/UsersController.php

 public function emailVerificationRequired(){
 return view('users.edit_email_notify');
 }
 

实现页面代码如下:

resources/views/users/edit_email_notify.blade.php

@extends('layouts.app')
@section('title', '发送邮箱验证')
@section('content')
 

验证邮箱


{{ route('verified_email', $user->verification_token) }}

如果这不是您本人的操作,请忽略此邮件。

到此邮件发送功能已经实现,用户点击发送验证邮箱按钮,就会收到邮件,用户可以进入邮箱,点击邮件链接验证邮箱。

用户点击邮箱验证链接完成验证。

上面我们已经成功发送邮件,用户会收到邮件,用户点击进行验证邮箱,我们继续完成验证邮箱功能。

设置路由,修改 routes 目录下 web.php 文件,增加一个路由,代码如下:

routes/web.php

Route::get('/email_verification/{token}', 'UsersController@verifiedEmail')->name('verified_email');
 

接下来为用户控制器定义一个 verifiedEmail 方法,该方法将用于验证邮箱。具体代码实现如下:

app/Http/Controllers/UsersController.php

 public function verifiedEmail($token){
 $user = User::where('verification_token',$token)->first();
 $user->verified = true;
 $user->verification_token = null;
 $user->save();
 Auth::login($user);
 session()->flash('success', '恭喜您,邮箱验证成功!');
 return redirect('/');
 }
 

至此邮箱验证功能已经全部完成。

收藏
分享
海报
0 条评论
203
上一篇:1磅蛋糕是几寸(3磅蛋糕是几寸) 下一篇:脐带绕颈胎儿会自己绕开吗(胎儿脐带绕颈怎么绕开)

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码