创建助手函数,随机验证码
1:在app目录下创建名叫helper.php的文件
2:在helper.php中写随机验证码的函数
function code_rand($len=4){
$str='';
for($i=0;$i<$len;$i++){
$a=mt_rand(0,9);
$str=$str.$a;
}
return $str;
}
3.这个文件是我们自己创建的,框架不会识别,需要我们在composer.json文件中处理自动加载,在更改了composer文件之后需要在Terminal终端中执行:composer dump;
"autoload": {
//自动加载数据库
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
//自动加载类
"App\\": "app/"
},
//自动加载文件
"files": [
"app/helper.php"
]
},
邮箱发送验证码:
1:创建发送验证码的类:RegisterNotify这个类是laravel框架的内置类
php artisan make:notification RegisterNotify
2:设置邮箱发送的内容:RegisterNotify中的toMail
public function toMail($notifiable)
{
return (new MailMessage)
//$this->code是第3步中new RegisterNotify传到这个类中的构造方法里的
->line('您好,你注册我网需要的验证码:'.$this->code.',已经发送到您的邮箱,欢迎注册我网');
}
3:利用邮箱发送验证码的逻辑代码:
//filter_var($request->username)是邮箱返回true
if(filter_var($request->username,FILTER_VALIDATE_EMAIL)){
$type='email';
firstOrNew这个方法的返回一个User的对象,比对邮箱,看数据库会不会有,有的话会返回一个这个消息的User对象,如果没有,就new一个空的对象,因为在调用notify时需要一个User对象
$user=User::firstOrNew(['email'=>$request->username])?:new User();
// 当是邮箱时给他发送邮件告知验证码,并且在new RegisterNotify给它把$code传过去
$user->notify(New RegisterNotify($code));
//未完
4:设置邮件发送时的配置
MAIL_DRIVER=SMTP
MAIL_HOST=smtpdm.aliyun.com
MAIL_PORT=80
MAIL_USERNAME=fs@mengju.mumeng.xyz
MAIL_PASSWORD=MJ123456fs
MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS=fs@mengju.mumeng.xyz
MAIL_FROM_NAME=mengju.mumeng.xyz
给手机发送短信验证码
1:手机发送验证码的逻辑代码:
//给手机号码做正则匹配
}elseif ('/^\d{11}$/'){
$type = 'mobile';
//这个是hdjs封装好的短信模板
$data = [
//短信签名
'sign' => '牧夢哟',
//短信模板
'template' => 'SMS_144145970',
//前台提交来的手机号码
'mobile' => $request->username,
//模板变量
'vars' => ["code" => $code],
];
//Aliyun这个类也是hdjs封装的函数,需要在Terminal终端中执行
//composer require houdunwang/aliyun加载houdunwang/aliyun这个类库
$res = Aliyun::instance('Sms')->send($data);
3.在AppServiceProvider配置短信发送的key和id,并且在这个类中的boot方法中引用这个方法,这样保证它可以在短信发送之前配置好
protected function loadConfig ()
{
Aliyun::config ( [
/*
|--------------------------------------------------------------------------
| 根据服务器所在区域进行选择
| https://help.aliyun.com/document_detail/40654.html?spm=5176.7114037.1996646101.1.OCtdEo
*/
'regionId' => 'cn-hangzhou' ,
/*
|--------------------------------------------------------------------------
| 如果使用主账号访问,登陆阿里云 AccessKey 管理页面创建、查看
| 如果使用子账号访问,请登录阿里云访问控制控制台查看
*/
'accessId' => 'LTAIcNOXhfU9jSMZ' ,
/*
|--------------------------------------------------------------------------
| 如果使用主账号访问,登陆阿里云 AccessKey 管理页面创建、查看
| 如果使用子账号访问,请登录阿里云访问控制控制台查看
*/
'accessKey' => '5HOslwGi0vhX4l2xLUaKU4qTv8oB9k' ,
] );
}
设置验证码过期时间:
1:在存储验证码时,存储验证码的过期时间
public function saveToSession($code,$type,$request){
session()->put('valid_code',[
'code'=>$code,
'type'=>$type,
'username'=>$request->username,
'expire'=>time()+$this->expire,//过期时间
]);
}
2:判断验证码是否过期,过期后扔出异常消息提示
public function checkexpire(){
//取出存在session里的过期时间和现在的时间做比较
$expire=session('valid_code.expire');
if($expire&&$expire>time()){
throw new ValidException('验证码发送过于频繁,请稍后再试');
}
}
邮件或者短信发送过程中的消息提示
1:创建一个异常类:这个类会生成在app/Exceptions下
php artisan make:exception ValidException
2:构建一个系统规定的方法render;
public function render(){
//response也是系统制定的一个对象,不能变
return response()->json(['code'=>$this->code,'message'=>$this->getMessage()],401);
}
3:调用:
public function checkexpire(){
$expire=session('valid_code.expire');
if($expire&&$expire>time()){
//抛出异常 throw调用
throw new ValidException('验证码发送过于频繁,请稍后再试');
}
}
针对复杂的验证规则,需要一个自定义表单请求的类:
1.创建表单请求类:这个请求是专为User类做验证的
php artisan make:request UserRequest;
2.在UserRequest这个类里的rules这个方法里写验证规则:
public function rules()
{
return [
'password'=>'required|confirmed',
'code'=>[
'required',
// $value是传递到account里的值
//这种复杂的验证规则可以在function体里
function ($attribute,$value,$fail){
if($value !=session('valid_code.code')){
return $fail('验证不正确');
}
return true;
}
]
];
}
3.在User类的需要此验证规则就引用这个验证,引用方式如下:
//UserRequest是表示在引用第二步的验证规则;
public function store(UserRequest $request)
{
//
}
创建中间件:做验证拦截
1.创建中间件:
php artisan make:middleware AuthAdmin
2.在AuthAdmin类里的handle中写验证规则,做拦截:
public function handle($request, Closure $next)
{
//符合此方法的逻辑,才能通过,进行下一步,负责会被拦截
if(!\Auth::check()||auth()->user()->is_admin!=1){
return redirect('/');
}
return $next($request);
}
3.调用中间件,要在路由组里调用:
//middleware:中间件
Route::group(['middleware'=>['admin.auth'],'prefix'=>'admin','as'=>'admin.','namespace'=>'Admin'],function (){
Route::get('/','HomeController@index')->name('home.index');
});
本文详细介绍如何在Laravel框架中实现随机验证码的生成、存储及验证,包括邮件和短信发送验证码的过程,以及如何设置验证码过期时间。同时,文章还讲解了如何创建自定义表单请求类和中间件来增强应用的安全性和功能性。
940

被折叠的 条评论
为什么被折叠?



