不同认证方式
我们先来看 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
加入这一段
- 这里插一下,如果是想把token放在header头里传值,还要在
- 如果不加入这一段只能从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()
方法把其排除了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。