Laravel 框架学习——多表 api 认证

本贴最后更新于 1645 天前,其中的信息可能已经事过境迁

前言

根据 Laravel 官方文档:api 认证
api 认证支持 Eloquentdatabase 方式,我这里的配置选用的是 database 方式

单表 api 认证

数据库

  • 表名:user
  • 字段:api_token 为必须,其它自选

config/auth.php

'guards' => [
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false
        ]
],
'providers' => [
        'users' => [
            'driver' => 'database',
            'table' => 'user'
        ]
]

多表 api 认证

新增中间件

运行

php artisan make:middleware EmployeeToken

该命令会在 App\Http\Middleware 目录下新增一个 EmployeeToken.php 文件

注册路由中间件

App\Http\Kernel 类中:

protected $routeMiddleware = [
  // 其它中间件...
  'employeeToken' => \App\Http\Middleware\EmployeeToken::class,
  // 其它中间件...
];

中间件代码

EmployeeToken 的代码如下

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\DB;

class EmployeeToken
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($req, Closure $next)
    {
        $api_token = $req->input('api_token');
        if($api_token == null){
          return response()->json([
            false,
            'Token无效!'
          ]);
        }
        $couriers = DB::select('SELECT * FROM employee WHERE api_token = ?', [ $api_token ]);
        if(count($couriers) != 1){
          return response()->json([
            false,
            'Token无效!'
          ]);
        }
        // api_token转换到courier表
        $req->setUserResolver(function() use ($couriers){
          return $couriers[0];
        });
        return $next($req);
    }
}

  • 检查请求输入参数 api_token 是否存在
  • 并检查在表 employee 中是否存在 api_token=输入参数 api_token 的记录
  • 不存在则直接返回 json,附带错误信息
  • 通过 setUserResolver 方法,传递一个闭包,使得 Requestuser() 方法返回 employee 表中 api_token=输入参数的 api_token 的一条记录

指定路由使用中间件

Route::middleware('employeeToken')->prefix('employee')->group(function(){

});
  • /api/employee/**/* 路由都使用 employeeToken
  • /api/employee/**/* 下路由对应的 Controller 中直接使用 request->user() 方法即可获取对应的访问 employee 表记录
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 526 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 683 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...