laravel5.3注册 登录 退出登录 邮箱找回密码 操作–邮箱找回密码
0,找回密码的逻辑
- 通过邮箱把找回密码的页面发送至用户输入的邮箱里面。
- 发送邮件时,通过用户填写的邮件信息,去数据库对应的查询这个用户的id,以及token。在重置用户密码的控制器中使用。
- 发送成功以后引导用户登录此邮箱。
- 登录成功后邮箱里面有对应的找回密码的链接。此路由需要携带此用户的id,token,通过点击这个链接,跳转至找回密码的路由。由此路由返回找回密码页面。
- 通过控制器接收路由传递的参数,进行给用户重置密码操作。
- 重置成功以后token重新生成,防止恶意攻击。
1,找回密码路由
//找回密码,发送邮件
Route::match(['get','post'],'retrieve','LoginController@retrieve');
//修改密码
Route::match(['get','post'],'editPwd/{id}/{token}','LoginController@editPwd');
2,发送邮件,重置密码,控制器
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
class LoginController extends Controller{
public function retrieve(Request $request){
if ($request->isMethod('GET')){
return view('admin.registerLogin');
}else{
//接收全部数据
$value = $request->all();
//验证规则
$rules = [
'email'=>'required|email',
'code'=>'required|captcha'
];
//提示信息
$message = [
'email.required'=>'邮箱不能为空',
'email'=>'邮箱格式不正确',
'code.required'=>'验证码不能为空',
'code.captcha'=>'验证码不正确'
];
//返回
$validator = \Validator::make($value,$rules,$message);
if ($validator->passes()){
$email = $request->input('email');
$result = DB::table('user')->where('email','=',$email)->first();
if ($result){
//发送验证码
Mail::send('mail.retrieve',['id'=>$result->id,'token'=>$result->token],function($message) use ($email){
$message->to($email);
$message->subject('找回密码');
});
//返回邮件地址,跳转到找回密码页面
$mail_arr = explode('@',$_POST['email']);
$href = "mail.".$mail_arr[1];
$data = [
'status'=>'200',
'href'=>$href,
'info'=>'发送成功'
];
return $data;
}else{
$data = [
'status'=>'5',
'info'=>'邮箱不存在,请重新输入'
];
return $data;
}
}else{
return response()->json([
'status'=>'4',
'info'=>$validator->errors()->first()
]);
}
}
}
//重置密码,从邮箱过来的页面
public function editPwd($id,$token,Request $request){
if ($request->isMethod('GET')){
//TODO <winner remarks>把get请求时传递的id,token返回,用于在editPwd视图中ajax请求时使用此参数
return view('admin.editPwd')->with(['id'=>$id,'token'=>$token]);
}else{
//验证请求的数据
//接收全部数据
$values = $request->request->all();
//定义规则
$rules = [
'email'=>'required|email',
'pwd'=>'required|same:repwd',
'code'=>'required|captcha'
];
$message = [
'email.required'=>'邮箱不能为空',
'email'=>'邮箱格式不正确',
'pwd.required'=>'密码不能为空',
'pwd.same'=>'两次密码不一致',
'code.required'=>'验证码不能为空',
'code.captcha'=>'验证码不正确'
];
$validator = \Validator::make($values,$rules,$message);
if ($validator->passes()){
$email = $request->input('email');
//echo $id.'--'.$token.'--'.$email;die();//TODO <winner remarks>在这里没办法直接使用editPwd()里面的$id,$token因为那是get请求传递的参数,这里是ajax请求过来的数据,需要在editPwd视图页面中的ajax请求地址那里面传递参数,这里才能接收到。
//再次验证用户是否存在
$result = DB::table('user')->where([['id','=',$id],['email','=',$email],['token','=',$token]])->first();
//var_dump($result);die();
if ($result){
//去数据库修改密码
//定义要修改数据的数组
$data = array();
//让token过期,防止恶意操作
$data['token'] = str_random(50);
$data['pwd'] = md5(md5($_POST['pwd']));
$edit_pwd = \DB::table('user')->where([['id','=',$id],['email','=',$email],['token','=',$token]])->update($data);
if ($edit_pwd){
$data = [
'status'=>'200',
'info'=>'找回成功,请登录',
'href'=>'http://www.hh.com/login'
];
return $data;
}else{
$data = [
'status'=>'203',
'info'=>'修改失败',
'href'=>'http://www.hh.com/login'
];
return $data;
}
}else{
$data = [
'status'=>'202',
'info'=>'用户数据有误,重新操作',
'href'=>'http://www.hh.com/retrieve'
];
return $data;
}
}else{
return response()->json([
'status'=>'201',
'info'=>$validator->errors()->first()
]);
}
}
}
}
3,重置密码控制器