资讯专栏INFORMATION COLUMN

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

JinB / 1073人阅读

摘要:不同认证方式我们先来看数组让我们可以配置一个提供者每个提供者可以选择不同的可以选择或者对应的驱动之后选择对应的配置项在拥有之后我们可以配置守卫守卫可以配置一个驱动者和一个提供者提供者就是我们上面配置的而驱动者则有认正认正可供选择默认使用的是

不同认证方式

我们先来看 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方法

通过查看底层的vendorlaravelframeworksrcIlluminateAuthTokenGuard.php方法,我们可以发现laravel5.5底层默认的是token字段,我们也可以在此自定义此字段,在此我使用了web_token作为认正字段

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

注:如果使用redis等nosql保存web_token的话也是需要web_token的,为了使laravel自带的Auth门面可以使用

建立完字段以后就可以写登录方法了:

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

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

贴上源码来看一波

首先还是vendorlaravelframeworksrcIlluminateAuthTokenGuard.php文件

这里插一下,如果是想把token放在header头里传值,还要在TokenGuard.php加入这一段

如果不加入这一段只能从body里面获取token,头里传的token获取不到,如果是我理解有误,希望指出

回到原来,我们要说Auth::user()方法, 这个方法会先实例化一个guard守卫指定的驱动,不指定的话就是默认的

可以参考这段代码vendorlaravelframeworksrcIlluminateAuthAuthManager.php

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

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


当我们调用Auth::user( ) 时会调用vendorlaravelframeworksrcIlluminateAuthTokenGuard.php里的

然后我们找到retrieveByCredentials()这个方法在vendorlaravelframeworksrcIlluminateAuthEloquentUserProvider.php

可以看出这个方法用token为条件在elquentModel里查出了一条userObject并返回给了我们

所以我们Auth::user() 得到的user对象是在model里用token查出来的,所以如果想使用此功能的话,数据库里的token字段一定要保持更新

当然你也可以抛弃不用,或者改变源码让他从redis中取到token和对应的id,再用id去model中取数据

这里理解了之后我们在写一个middleware用来验证在访问网站时token是否正确就行了

把新建的middleware加入kernel.php

最后在要被验证的方法里的构造方法里调用这个middleware就可以开启我们得token验证了

如果你有某个方法不想使用验证, 可以使用except()方法把其排除了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30144.html

相关文章

  • Laravel核心解读--用户认证系统的实现细节

    摘要:通过装载看守器和用户提供器装载看守器和用户提供器用到的方法比较多,用文字描述不太清楚,我们通过注解这个过程中用到的方法来看具体的实现细节。 用户认证系统的实现细节 上一节我们介绍来Laravel Auth系统的基础知识,说了他的核心组件都有哪些构成,这一节我们会专注Laravel Auth系统的实现细节,主要关注Auth也就是AuthManager是如何装载认证用的看守器(Guard)...

    NicolasHe 评论0 收藏0
  • Lumen用户认证JWT,源码解读

    摘要:如何做用户认证根据文档描述,提供用户认证的接口,他的核心是看守器和提供器,看守器定义怎么认证用户,提供器定义怎么检索用户。 最近的一个PHP项目,上一个项目是采用ThinkPHP来弄的,因为很早就听说过Laravel的大名,所以进了Laravel的官网,意外发现了Lumen,正好我项目是提供API的,所以选择了Lumen,因为是Laravel的精简版,看了几天的Laravel文档,也总...

    AZmake 评论0 收藏0
  • Laravel中的Auth

    摘要:中的中有一个组件叫,组件提供了整个框架的认证功能,这里想简单追踪一下它的实现逻辑。 Laravel中的Auth laravel中有一个组件叫auth,auth组件提供了整个框架的认证功能,这里想简单追踪一下它的实现逻辑。 首先从 php artisan make:auth 开始 # IlluminateAuthConsoleAuthMakeCommand.php public fu...

    张汉庆 评论0 收藏0
  • Laravel 用户多字段认证优雅解决方案

    摘要:弊端显而易见,如果另一个不是就抓瞎了,下面是另一种通用的解决方案在中重写方法假设字段是假设字段是假设字段是可以看到虽然能解决问题,但是显然有悖于的优雅风格,卖了这么多关子,下面跟大家分享一下我的解决方案。 解决方案: 登录字段不超过两个的(简单的解决方案) 登录字段大于或等于三个的(相对复杂一些) 登录字段不超过两个的 我在网上看到一种相对简单解决方案,但是不能解决所有两个字段的验...

    jk_v1 评论0 收藏0
  • Angular 2.x 从0到1 (五)史上最简单的Angular2教程

    摘要:如果该构造函数在我们所期望的中运行,就没有任何祖先注入器能够提供的实例,于是注入器会放弃查找。但装饰器表示找不到该服务也无所谓。用处理导航到子路由的情况。路由器会先按照从最深的子路由由下往上检查的顺序来检查守护条件。 第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2.0 从0到1 (三)第四节:Angular 2...

    dcr309duan 评论0 收藏0

发表评论

0条评论

JinB

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<