laravel 验证码 auth方式登录 中间件判断session是否存在
首先下载laravel的插件 composer下载 实现验证码 composer require mews/captcha
在config/app.php
进行配置
‘providers’ => [ // … Mews\Captcha\CaptchaServiceProvider::class, ] ‘aliases’ => [ // … ‘Captcha’ => Mews\Captcha\Facades\Captcha::class, ]
终端手脚架运行 php artisan vendor:publish 10
生成 captcha.php文件 在文件中更改默认配置
编写 只有用户名 密码 验证码的 登录 的html页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <div style="width: 500px ;height: 400px ;margin: 0 auto;background-color: #0C9A9A"> <div style="font-size: 30px;margin: 0 auto">登录页面</div> <form action="{{route('week2.login')}}" method="post" style="width: 300px;height:300px ;margin: 0 auto"> @csrf <div class="form-group"> <label for="exampleInputEmail1">用户名</label> <input type="text" class="form-control" id="exampleInputEmail1" name="username" placeholder="用户名"> </div> <div class="form-group"> <label for="exampleInputPassword1">密码</label> <input type="password" class="form-control" id="exampleInputPassword1" name="password" placeholder="Password"> </div> <div class="form-group"> <label for="exampleInputFile">验证码</label> <div style="margin-left: 10px;"> <img src="{{ captcha_src('flat') }}" style="cursor: pointer" onclick="this.src='{{captcha_src('flat')}}&'+Math.random()" > </div> <input type="text" class="form-input" name="captcha" placeholder="请输入验证码"> </div> <button type="submit" class="btn btn-default">登录</button> </form> </div> </body> </html>
auth方式验证用户信息
<?php namespace App\Models; use \Illuminate\Foundation\Auth\User as AuthUser;
//创建模型层 继承laravel自带user验证
class LoginModel extends AuthUser
{
//绑定数据表 也创建直接绑定表的model
protected $table = 'logins' ;
//设置隐藏字段
protected $guarded =[];
}
脱坑 测试时用户数据库密码 //www.jisuan.mobi/p163u3BN66Hm6JWx.html 可以修改数据库测试密码
在 config/auth.php 中修改 绑定的模型层
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => \App\Models\LoginModel::class, ],
手脚架 创建中间件 php artisan make:middleware CheckAge
这里写的是全局路由前置中间件 见 laravel手册 //learnku.com/docs/laravel/5.8/middleware/3891
app/Http/Kernel.php 中的 $routeMiddleware 属性中列出这个中间件
protected $routeMiddleware = [ 'login' => \App\Http\Middleware\LoginkAge::class, ];
路由
Route::get('list','UsersController@list')->name('week2.list')->middleware('login'); // 路由中 middleware(注册的名字) 在分组也可以用
中间件文件写入
public function handle($request, Closure $next) {
//auth验证用户是否登录 if (!auth()->check()&&!($request->session()->get('name'))
){ return redirect(route('week2.index'),302); } return $next($request); }
控制器接收处理全部数<?php
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; class LoginController extends Controller { // 登录页面 public function index(){ return view('week2.login'); } // 登录处理 public function login(Request $request){ $posts['captcha'] = $request->input('captcha'); $rule = [ 'captcha'=>'required|captcha', ]; $massage = [ 'captcha.required'=>'验证码不为空', 'captcha.captcha'=>'验证码错误', ]; $validate = Validator::make($posts,$rule,$massage); if ($validate->fails()) { return $validate->errors()->first() ; } $post = $request->input('_token'); $post = $request->validate([ "username" => 'required', 'password' => 'required', ],[ 'username.required' =>'用户名不为空', 'password.required' =>'密码不为空', ]);
//查询是否正确 $bool = auth()->attempt($post); if (!$bool){ return view('week2.login'); }
//正确跳转到 欢迎页面
$request->session()->put('name',$post);
return redirect(route('week2.list'),302); } }