Laravel – Auth验证流程以及guard守卫和自定义驱动driver驱动,使用web-token验证

102次阅读

共计 1794 个字符,预计需要花费 5 分钟才能阅读完成。

不同认证方式
我们先来看 config/auth.php

provider

providers 数组让我们可以配置一个提供者, 每个提供者可以选择不同的 driver.driver 可以选择 eloquent 或者 database ,
对应的驱动之后选择对应的配置项,eloquent:model,database:table

guard

在拥有 provider 之后我们可以配置 guards 守卫, 守卫可以配置一个驱动者和一个提供者
提供者就是我们上面配置的 provider
而驱动者则有 session(session 认正),token(token 认正) 可供选择
默认 api 使用的是 token 认正, 而 web 用户使用 session 认正

session 认正

在认证时我们可以使用 Auth::attempt([’email’ => $email, ‘password’ => $password]) 方法, 此方法在验证成功后会自动为这个用户设置一个认证 Session,标识该用户登录成功
后面就可以使用 Auth::guard()->check() 方式验证用户是否已经登录

token 认正

此认正方式 laravel 虽然提供了驱动方法, 但是并没有默认它为验证方式, 也没有提供自动生成 token 的方法, 要使用此方法要自定义 login 方法
通过查看底层的 \vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php 方法, 我们可以发现 laravel5.5 底层默认的是 token 字段, 我们也可以在此自定义此字段, 在此我使用了 web_token 作为认正字段

然后我们还要在数据库里建立相应的字段 web_token

注: 如果使用 redis 等 nosql 保存 web_token 的话也是需要 web_token 的, 为了使 laravel 自带的 Auth 门面可以使用
建立完字段以后就可以写登录方法了:

在这里还是使用了 redis 去保存 token, 便于设置 token 的过期时间

至于为什么还要保存在数据库里, 在注销或者 token 过期的时候还要更新数据库的 token, 是因为 Auth 底层获取 user 的方法是从数据库进行获取的
贴上源码来看一波

首先还是 \vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php 文件
这里插一下, 如果是想把 token 放在 header 头里传值, 还要在 TokenGuard.php 加入这一段

如果不加入这一段只能从 body 里面获取 token, 头里传的 token 获取不到, 如果是我理解有误, 希望指出
回到原来, 我们要说 Auth::user() 方法, 这个方法会先实例化一个 guard 守卫指定的驱动, 不指定的话就是默认的
可以参考这段代码 \vendor\laravel\framework\src\Illuminate\Auth\AuthManager.php

指定的话, 就会去实例化指定的 guard, 比如 Auth::guard(‘user’)->user()

我们这里默认的就是守卫 adminToken 的驱动就是 token

当我们调用 Auth::user() 时会调用 \vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php 里的

然后我们找到 retrieveByCredentials() 这个方法在 vendor\laravel\framework\src\Illuminate\Auth\EloquentUserProvider.php

可以看出这个方法用 token 为条件在 elquentModel 里查出了一条 userObject 并返回给了我们
所以我们 Auth::user() 得到的 user 对象是在 model 里用 token 查出来的, 所以如果想使用此功能的话, 数据库里的 token 字段一定要保持更新
当然你也可以抛弃不用, 或者改变源码让他从 redis 中取到 token 和对应的 id, 再用 id 去 model 中取数据
这里理解了之后我们在写一个 middleware 用来验证在访问网站时 token 是否正确就行了

把新建的 middleware 加入 kernel.php 中

最后在要被验证的方法里的构造方法里调用这个 middleware 就可以开启我们得 token 验证了
如果你有某个方法不想使用验证, 可以使用 except() 方法把其排除了

正文完
 0