laravel之Auth剖析

来源:互联网 发布:淘宝手机端承接页装修 编辑:程序博客网 时间:2024/05/22 07:06

最近的项目虽然已经有自己的登陆认证系统,但是感觉接入laravel默认的始终会好一些,手册上只提供了几个简单的使用方法.搞技术的就需要有”然其然,然其所以然”的精神,所以好好的扒了扒其代码,以此记录.

通过在 控制器中添加

$this->middleware('auth');

为控制器提供认证服务
查看auth指向的中间件类的文件,在构造函数中注入了一个

Illuminate\Contracts\Auth\Factory

,并且handle方法参数guards使用的是可变参数的写法,后面处理可变的,从代码里可以看出,guard可以传多个,经过遍历,哪个guard有结果都可以继续将流程走下去.

在判断guard的结果时,多次使用了上面构造函数中的 使用 $this->auth 引用, 注入接口Illuminate\Contracts\Auth\Factory 看源代码,其只是个interface,一个接口而已,但其具体是由哪个实现了该接口的类实现的呢.
在此为了方便,我偷懒用
dd($this->auth);
打印出来了该实例,类名叫 AuthManager , 那这个 AuthManager应该是已经注册在容器中了,找到Auth的Provider ,Illuminate\Auth\AuthServiceProvider , AuthManager实例绑定到auth的接口名称,这个接口名称对应的是
\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class
,所以针对Factory的实现,使用了AuthManager
再看Auth中 getFacadeAccessor方法的实现,他对应的同样也是 auth接口名称,也就是说我们在操作 Auth 以及中间件Authenticate 时,都是AuthManager的实例在起作用,既然认证的核心都指向了AuthManager那我们就来仔细研究研究它.
在其源代码中,可以看到他与config/auth.php 文件密切相关,在使用AuthManager时,通常需要先指定guard,如下面这样使用
Auth::guard(‘admin’),如果没有调用guard()方法,会自动使用默认的guard.
另外通过guard.driver的设置,决定调用createSessionDriver 还是 createTokenDriver ,配置 provider 来设置 认证的数据来源 ,这里以Session驱动为例,
在我们平时调用时 Auth::id(); Auth::user() ,但AuthManage中并没有对应的方法,这里实际是使用了 __call 魔术方法,操作实体变成了 SessionGuard的实例,最终起作用的实际上就是 SessionGuard.

到此为止认证的流程才结束了.关于如何使用Token认证,下篇再写.

原创粉丝点击