简介:
如下,以6.0版本框架,新建一个路由文件,并且使用laravel的中间件,实现简单的登录验证。
生成路由的流程:
1:创建控制器文件:php artisan make:controller Admin\LoginController。
2:创建admin.php路由文件:routes文件夹下。
3:App\Providers\RouteServiceProvider.php 文件新增 map访问方法。
4:创建路由中间件验证文件 app/Http/Middleware 目录下 php artisan make:middleware CheckAdmin。
5:app/Http/Kernel.php 文件分配中间件组。
步骤如下:
1、先创建一个新的UserController.php控制器,直接通过指令创建。然后新增一个login()登录方法,和一个getUser()获取会员信息方法。
php artisan make:controller User\UserController
2、在路由目录routes下新增一个user.php路由文件。并新增相应的登录和获取会员信息的路由地址。(注意斜杠的方向)
3、在RouteServiceProvider.php路由类中进行访问指定,并且实现相应的方法。(直接参考原有的api或是web路由,复制一个然后改下名字)。
4、为新的user路由新增一个验证中间件(比如说请求这个接口,是怎么验证,或是说应该过滤掉什么,都可以通过这个中间件来实现)。可以直接通过指令创建。
php artisan make:middleware CheckUser
5、通过Kernel.php路由组文件,为新增的路由分配路由组。
如上,已经基本创建完了一个新的user路由文件。现在我们访问测试一下。
分别访问:
登录地址:域名/user/member/login
会员信息:域名/user/member/getUser
如上已经基本上完成了新的路由的创建,那么我们如何通过中间件来实现验证和登录呢。
--------------------------------------------------------------------------------------------------------华丽的分割线---------------------------------------------------------------------------------------------------
实现简单的登录验证:
1:为中间件添加验证逻辑,我们使除了登录方法login()不需要验证token,其他方法都需要验证token。
2:为控制器添加通过账户加密码登录获取的token方法。
具体如下:
1、改写中间件,添加验证。
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Redis; class CheckUser { //定义一个访问白名单 private $whiteList = [ '/user/member/login',//会员登录接口 ]; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { //如果在白名单的,不需要验证 if($this->checkWhiteList()){ return $next($request); } //验证token // $token = $request->header("Authorization", ""); $token = $request->get("Authorization", "");//token一般是放在header头部,这里为了方便测试通过get传入 $this->checkToken($token); return $next($request); } // 判断是否在白名单内 public function checkWhiteList() { $url = substr(url()->current(), strlen(url()->previous()));//获取相对路径 如:/user/member/login return in_array($url, $this->whiteList); } //验证token public function checkToken($token) { if(empty($token)){ exit('请传入token'); } //验证token $user = Redis::get($token); if(empty($user)){ exit('token有误'); } //验证通过 } }
2、为控制器添加登录方法,和通过获取到的token取的会员信息的方法。
<?php namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Validator; use Illuminate\Support\Facades\Redis; class UserController extends Controller { //会员登录 public function login(Request $request) { // 字段验证 $rules = [ 'user' => 'required|string', 'pass' => 'required|string', ]; $validator = Validator::make($request->all(), $rules); if($validator->fails()){ return $validator->errors()->first(); } if($request->input('user') != 'Tom' || $request->input('pass') != '123456'){ return '账户或密码有误'; } //简写 //验证成功,生成token $token = md5($request->input('user').$request->input('pass')); if(Redis::exists($token)){//放入redis缓存 echo '已登录token='; }else{ $user = [ 'user' => $request->input('user'), 'time' => date('Y-m-d H:i:s'), 'ip' => $request->ip(), ]; Redis::set($token, json_encode($user), 60 * 60 *48); echo '登录成功token='; } return $token; } //获取会员信息 public function getUser(Request $request) { // $token = $request->header("Authorization", ""); $token = $request->get("Authorization", "");//token一般是放在header头部,这里为了方便测试通过get传入 //获取登录信息 $user_info = Redis::get($token); dump(json_decode($user_info)); return $request->getRequestUri(); } }
如上,即完成一个简单的登录,我们通过账户Tom和密码123456来测试线。
结束,如上信息是存在Redis缓存中,注意本地是否有连接Redis。