Laravel guard 菊花守卫者
前言#
在 go-zero 文档中有句话我觉得不错: 工具大于约定和文档
。laravel 提供了很多优雅的工具,比如 门面,队列,对于开发者来说很友好。
auth 在小型项目中使用 Passport 就大材小用了。Laravel Passport 自定义添加 Client
这篇文章主要介绍了简单的 token 验证。
开 始#
添加用户表 api_token (或者自定义,后面说)
php artisan make:migration alter_users_add_api_token
public function up() { Schema::table('users', function (Blueprint $table) { $table->string('api_token',200)->comment('登录token'); }); }
php artisan migrate
users 表中添加了 api_token
创建一条数据 api_token
为 :s8df78a7d8f7as78d
在路由中添加一个访问路径
Routephp:group(['middleware' => ['auth.api']], function () {
Route::get('/getUser', function () {
var_dump( Auth::user()->name);exit;
});
});
这时访问,会报:
说明我们这个 auth.api
的这个中间件不存在,需要我们创建一个
php artisan make:middleware WebToken
创建一个中间件 WebToken
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class WebToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (Auth::guard('api')->guest()) {
return response()->json(['code' => 401,'msg' => 'token错误或为空']);
}
return $next($request);
}
}
在 Kernel.php
中添加中间件:
这时访问 /api/getUser
提示 token 错误或为空 ,这时因为我们没有传入 token
再尝试访问: /api/getUser?api_token=s8df78a7d8f7as78d
可以看到我们在路由那边打印的 Auth::user()->name
是报错的,但是其实它是验证通过的。
到了这,可能很多同学会说,这个假教程,怎么获取不到 name,取关了取关了!!!!
下面一一解释:
这边主要讲 defaults
guards
providers
三个参数的作用。
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'菊花园守卫者' => [
'driver' => 'token',
'provider' => '菊花园提供者'
]
],
guards
熟称守卫队,也可以把它想象成保卫程序的一群守卫员,
开个玩笑:你可以想象成有一个守卫需要保护菊花园,所以我们认为他是一个菊花园守卫者,那他要守卫的对象又是谁呢?(有画面了吗?)
是 providers
装菊花提供者,里面可以配置对应的数据库,很多业务场景中,(举个🌰)可能有多个业务平台需要登录管理用户,比如:仓库用户放一个表,客户用户一个表等等~
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'菊花园提供者' => [
'driver' => 'database',
'table' => '放菊用户表(每一个用户都有一朵菊花)',
],
],
我们回过来看,在刚开始的时候在中间件中使用过 guards
if (Auth::guard('api')->guest()) {
return response()->json(['code' => 401,'msg' => 'token错误或为空']);
}
指定的守卫是 api
进行守卫
所以正确的获取用户信息应该是需要告诉 Auth 它目前守卫的到底是哪个用户组:是 web 呢?还是 api? 或者是菊花呢?
Auth::guard('api')->user()->name
这样便能获取到姓名,有同学会说,可以不要指定的 guard 获取用户信息吗?
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
在 defaults 设置默认的 guard 为 api,就可以使用获取用户了
Auth::user()->name
可不可以数据库不要命名为 api_token 叫做 access_token 呢?或者前端传递的时候不要是?api_token 改成?token 。
只需要在 guards 对应的守卫中添加:
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
'input_key'=>'token',
'storage_key'=>'access_token'
],
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: