老司机带你领悟 Laravel 之授权系统
前言
这篇博文主要是带大家了解laravel的授权系统,依照惯例,我会忽略一些细节,大家自己有兴趣的话,自行阅读。如果你仔细阅读了我之前写的,我觉得读懂这篇博文,简直不要太容易。
准备
在阅读这篇博客之前,你一定要阅读《老司机带你深入理解 Laravel 之 Facade》,这是必须的。
Auth Facade
我们的分析从Illuminate\Support\Facades\Auth
开始,下面是它的定义:
我们搜索整个laravel项目,搜索关键词'Auth'
,在Illuminate\Auth\AuthServiceProvider
中可以看到:
这里给Auth
注册了一个单例,也就是说所有对Illuminate\Support\Facades\Auth
的操作实际上就是在操作Illuminate\Auth\AuthManager
类的实例对象,下面我以Auth::guard()
方法给大家分析,大家应该操作过这个方法吧。
这里的getDefaultDriver
返回默认的驱动,我们来看看:
这里直接读取app/auth.php文件的defaults
下的guard
,打开我的配置文件,可以看到:
返回到guard
方法中,继续调用resolve
方法,如下:
这里的getConfig
方法会读取到下面的配置:
返回到resolve
方法中:
从这里的分析可以看到createSessionDriver
方法被调用
首先这里的createUserProvider
方法被调用,它的$config['provider']为users
,我们来看一下这个方法:
这里的$config就是:
因为driver
是eloquent
,所以这里会调用createEloquentProvider
方法:
也就是说createEloquentProvider
方法返回了一个\Illuminate\Auth\EloquentUserProvider
类的对象,我们再次回到createSessionDriver
方法中:
这里创建了一个SessionGuard
类的对象,至此resolve
方法解析完毕,返回到guard
方法中,如果你需要验证这一点的话,你可以在任何一个控制器中,运行dd(Auth::guard())
会返回一个SessionGuard
类的对象。
当我们授权用户的时候,我们会使用到如下所示的代码:
/***
@var $guard SessionGuard
* **/
$guard = Auth::guest();
$guard->attempt(["name"=>"DennisRitche","password"=>"Goodbyte World"]);
根据上面的分析,SessionGuard
类的attempt
方法被调用:
这里的provider
就是我们之前创建的Illuminate\Auth\EloquentUserProvider
类对象,我们看下它的retrieveByCredentials
方法:
上面的createModel
实际上就是创建一个我们之前配置的类的对象:
retrieveByCredentials
方法根据我们的用户名从数据库查询出对应的记录,返回到SessionGuard
类的attempt
方法中,继续调用如下代码:
方法hasValidCredentials
作用就是验证我们提交的密码是否和数据库里面的密码是相等(数据库里面的密码加密过,所以在比较之前,用户提交的密码也需要经过加密步骤),这部分代码很简单,这里略过,如果hasValidCredentials
返回true
,表示验证通过,此时login
方法被调用:
首先调用updateSession
方法会把当前登陆的用户标识写入到session中:
接下来调用setUser方法,如下:
这里记录了当前登录的用户,以后每次Auth::user()
调用都会获取到这个用户实例。
总结
上面简要的分析了Laravel的授权系统,代码本身并不复杂,我也是给大家介绍了一下分析的思路,很多细节,需要自己去分析和理解。我有一个QQ群,有兴趣的可以加一下:
本作品采用《CC 协议》,转载必须注明作者和本文链接
很棒!
好好好
mark
mark.以后再看.
mark
写的很棒,我感觉只要真正明白了 服务容器 和 服务提供者,源码看起来就感觉容易了很多。
https://github.com/nfangxu/hyperf-http-aut...
邀请大佬一起完善一下这个包 :joy: :joy: :joy:
mark
两大亮点