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 协议》,转载必须注明作者和本文链接
本帖由系统于 3周前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

学到了学到了 :+1:

1年前 评论

几天内看了四五遍,大概是弄懂了guard是个什么东西。切换使用不同的guard就是切换认证时使用的driver、provider。guard的配置文件就是config/auth.php。 我理解对了不

6个月前 评论
liaosp (楼主) 6个月前

官方文档说了,guards目的是为了保存使用者的信息
providers则是提供一份名单,或者理解为数据库。用于和guards中登记的session中的个人用户信息进行匹配。
匹配的方法是attempt。
假设你要回家。你该如何打开家门。你家是智能锁。
你用的密码。
你爸妈用的是指纹。
那你觉得这个智能锁系统中应该有什么信息?
首先是谁在开门?其次我的系统数据库中有没有你的记录,有没有你的信息。
guards中driver就是如此。
他们怎么保存你的信息。有的用session,有的用token。
token是可以解析出你的信息。
而session则是可以保存你的信息。
而providers则是说你选择eloquent,还是data.
这里隐藏的条件就是如果选择你eloquent,就会在所有eloquent模型中进行匹配。data也是如此。

3个月前 评论

外国人搞国区,越搞越乱,台湾人翻译,越翻越离谱??

3个月前 评论

有趣,又 get 到了信息。 我在想所有有关于用户验证的都可以走这个。 比方说微信授权登录的,或者三方登录的。这样统一管理会比较方便。

3周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!