Lumen6 /laravel 框架路由请求实现token验证

news/2024/12/21 20:08:52/

版本

Lumen6.0

中文文档:https://learnku.com/docs/lumen/5.7/cache/2411

实现功能效果

1、使用缓存存储用户token

2、从请求头head 中获取用户token

3、返回指定的认证失败结构体

4、对指定的接口路由做身份验证

 第一步:解除注释

注意: 

在使用 Lumen 的认证功能前,

1、取消 bootstrap/app.php 文件中的 AuthServiceProvider 调用代码的注释。

2、去掉 bootstrap/app.php 文件中 $app->withFacades() 方法调用的注释。

3、去掉bootstrap/app.php 文件中 $app->routeMiddleware([
     'auth' => App\Http\Middleware\Authenticate::class,
 ]); 注释

第二步:接口路由验证身份 routes/web.php

<?php
$router->post('/user/login', 'UserController@login'); //登录/*** 需要登录的路由 使用 Auth 中间件*/
$router->group(['middleware' => ['auth']], function () use ($router) {$router->get('/user/info', 'UserController@user_info'); //获取用户信息
});

第三步:修改验证器方法  App\Providers\AuthServiceProvider.php

<?phpnamespace App\Providers;use App\Models\UserToken;
use App\Services\Cache\AuthCache;
use App\User;
use Illuminate\Support\ServiceProvider;class AuthServiceProvider extends ServiceProvider
{/*** Register any application services.** @return void*/public function register(){//}/*** Boot the authentication services for the application.** @return void*/public function boot(){// Here you may define how you wish users to be authenticated for your Lumen// application. The callback which receives the incoming request instance// should return either a User instance or null. You're free to obtain// the User instance via an API token or any other method necessary.//        $this->app['auth']->viaRequest('api', function ($request) {
//            if ($request->input('api_token')) {
//                return User::where('api_token', $request->input('api_token'))->first();
//            }
//        });$this->app['auth']->viaRequest('api', function ($request) {/*** 下面验证内容是自定义的* 下面是用了两个表一个存token,一个存用户* 从请求头中获取token* 去用户user_token表中验证,存在则查出来用户信息返回到模型中*///从消息头获取传入的token$token = $request->headers->get('Authorization');$a = explode(" ", $token);if (isset($a[1]) && $a[1]) {$token = $a[1];}//token验证通过返回当前认证用户
//            $token = UserToken::where('token',$token)->first();//从缓存中获取用户id$user_id = AuthCache::get_token_user_id($token);if($user_id){//返回user模型return User::where('id',$user_id)->first();}return null;});}
}

以上方式是通过缓存中查询token的,此处也可以改成数据库中查询,或者使用jwt解析

原理就是通过请求接口传输过来的token信息,通过token查询到关联的用户id,然后再查询用户信息,返回整个用户模型,之后就可以使用Auth::user() 拿到用户数据

第四步:查看user model模型下的内容,正常安装后是不需要改动的,这里我继承了一个自己写的BaseModel父类。

<?php
namespace App\Models;use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Laravel\Lumen\Auth\Authorizable;class User extends BaseModel implements AuthenticatableContract, AuthorizableContract
{protected string $title = '用户表';protected $guarded = ['id'];protected $table = 'users';/*** 复用下面两个trait类*/use Authenticatable, Authorizable;//    /**
//     * The attributes that are mass assignable.
//     *
//     * @var array
//     */
//    protected $fillable = [
//        'name', 'email',
//    ];/*** The attributes excluded from the model's JSON form.** @var array*/protected $hidden = ['password',];}

第五步:修改认证失败后的,返回结构App/Http/Middleware/Authenticate.php

看一下默认返回结构

修改后返回结构,这里可以自定义,正常情况我们应在项目定义一个全局的返回结构体方法提供使用。

 

<?phpnamespace App\Http\Middleware;use App\Common\Common;
use App\Common\StatusConstants;
use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;class Authenticate
{/*** The authentication guard factory instance.** @var \Illuminate\Contracts\Auth\Factory*/protected $auth;/*** Create a new middleware instance.** @param  \Illuminate\Contracts\Auth\Factory  $auth* @return void*/public function __construct(Auth $auth){$this->auth = $auth;}/*** Handle an incoming request.** @param  \Illuminate\Http\Request  $request* @param  \Closure  $next* @param  string|null  $guard* @return mixed*/public function handle($request, Closure $next, $guard = null){if ($this->auth->guard($guard)->guest()) {//这是默认的返回结构
//            return response('Unauthorized.', 401);//修改返回结构return response()->json(['code'=>404,'msg'=>'无效的token','data'=>[]]);//            Common::response_result(StatusConstants::ERROR_UNAUTHORIZED_TOKEN,'无效的token');}//验证通过return $next($request);}
}

 


http://www.ppmy.cn/news/46797.html

相关文章

Java的7大好处

Java 的 7 大优势 当 Sun Microsystems 在 1995 年发布 Java 语言环境白皮书时&#xff0c;他们列出了 Java 将给软件开发领域带来的以下 7 大好处&#xff1a; Java 简单而熟悉。Java是面向对象的。Java 是体系结构中立的。Java 健壮且安全。Java是多线程的。Java具有高性能。…

哈希表题目:在系统中查找重复文件

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法思路和算法代码复杂度分析 进阶问题答案后记 题目 标题和出处 标题&#xff1a;在系统中查找重复文件 出处&#xff1a;609. 在系统中查找重复文件 难度 6 级 题目描述 要求 给定一个目录信息列表 paths…

入门神经网络——浅层神经网络

文章目录 一、基础知识1.浅层神经网络介绍2.浅层神经网络的正向传播3.反向传播 二、浅层神经网络代码实例 一、基础知识 1.浅层神经网络介绍 此次构件浅层神经网络&#xff0c;相比于单神经元&#xff0c;浅层神经网络拥有多个神经元&#xff0c;因此又可以称为多神经元网络&…

Ubuntu 自带截图工具快捷键盘

PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录。 Shift PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录。 Alt PrtSc –获取当前窗口的截图并保存到 Pictures 目录。 Ctrl PrtSc – 获取整个屏幕的截图并存放到剪贴板。 Shift Ctrl PrtSc – 获取屏幕的某个…

【消费战略】解读100个食品品牌丨王小卤 4年10亿爆品破局

爆品破局 王小卤的聚焦发展! 王小卤创建于 2016 年&#xff0c;与饮料行业的独角兽元气森林同年。 相较于元气森林的快速增长&#xff0c;王小卤历经 三年坎坷之路&#xff0c;直至 2019 年才踏上高增长的赛道&#xff0c;实现四年十亿的增长。 “所有的消费品都值得重新 做…

SSM框架MyBatis 三种分页查询 PageHlper的使用以及五个参数的简单解释

SSM框架MyBatis 三种简单的分页查询 1. 基础分页查询&#xff08;环境在第一天的配置中有&#xff09; mapper也就是dao //查询总数Select("select count(*) from book;")int selectCount();//分页查询Select("select * from book limit #{currpage},#{size}&q…

KD2684S电机匝间耐电压测试仪

一、产品简介 试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题&#xff0c;以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等&#xff0c;都会造成线圈层间或匝间绝缘层的绝缘…

NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038

之前使用querydatabasetable处理器来获取mysql中的数据,我们只能写死一个sql的查询语句,但是 实际引用环境中,我们的一张mysql的表,可能有上千万的数据,那么,不可能,我们把sql查询语句写死,这样一次性如果获取所有数据,那么压力太大了,我们怎么弄呢?找了很久没有找到相关教程…