Laravel框架用户登陆身份验证实现方法详解


Posted in PHP onSeptember 14, 2017

本文实例讲述了Laravel框架用户登陆身份验证实现方法。分享给大家供大家参考,具体如下:

laravel中检测用户是否登录,有以下的代码:

if ( !Auth::guest() )
{
  return Redirect::to('/dashboard');
}

Auth::guest是如何调用的呢?

laravel用了Facade模式,相关门面类在laravel/framework/src/Illuminate/Support/Facades文件夹定义的,看下Auth类的定义:

class Auth extends Facade {
  /**
   * Get the registered name of the component.
   *
   * @return string
   */
  protected static function getFacadeAccessor() { return 'auth'; }
}

laravel框架中,Facade模式使用反射,相关方法其实调用app['auth']中的方法,app['auth']是什么时候创建的呢,

AuthServiceProvider::register方法会注册:

$this->app->bindShared('auth', function($app)
{
  // Once the authentication service has actually been requested by the developer
  // we will set a variable in the application indicating such. This helps us
  // know that we need to set any queued cookies in the after event later.
  $app['auth.loaded'] = true;
  return new AuthManager($app);
});

那为什么最终会调到哪里呢,看下堆栈:

Illuminate\Support\Facades\Auth::guest()
Illuminate\Support\Facades\Facade::__callStatic
Illuminate\Auth\AuthManager->guest()
Illuminate\Support\Manager->__call
public function __call($method, $parameters)
{
    return call_user_func_array(array($this->driver(), $method), $parameters);
}

看下driver的代码:

public function driver($driver = null)
{
    $driver = $driver ?: $this->getDefaultDriver();
    // If the given driver has not been created before, we will create the instances
    // here and cache it so we can return it next time very quickly. If there is
    // already a driver created by this name, we'll just return that instance.
    if ( ! isset($this->drivers[$driver]))
    {
      $this->drivers[$driver] = $this->createDriver($driver);
    }
    return $this->drivers[$driver];
}

没有会调用getDefaultDrive方法

/**
* Get the default authentication driver name.
*
* @return string
*/
public function getDefaultDriver()
{
    return $this->app['config']['auth.driver'];
}

最终调用的是配置文件中配置的driver,如果配的是

'driver' => 'eloquent'

则调用的是

public function createEloquentDriver()
{
    $provider = $this->createEloquentProvider();
    return new Guard($provider, $this->app['session.store']);
}

所以Auth::guest最终调用的是Guard::guest方法

这里的逻辑先从session中取用户信息,奇怪的是session里只保存的是用户ID,然后拿这个ID来从数据库中取用户信息

public function user()
{
    if ($this->loggedOut) return;
    // If we have already retrieved the user for the current request we can just
    // return it back immediately. We do not want to pull the user data every
    // request into the method because that would tremendously slow an app.
    if ( ! is_null($this->user))
    {
      return $this->user;
    }
    $id = $this->session->get($this->getName());
    // First we will try to load the user using the identifier in the session if
    // one exists. Otherwise we will check for a "remember me" cookie in this
    // request, and if one exists, attempt to retrieve the user using that.
    $user = null;
    if ( ! is_null($id))
    {
      //provider为EloquentUserProvider
     $user = $this->provider->retrieveByID($id);
    }
    // If the user is null, but we decrypt a "recaller" cookie we can attempt to
    // pull the user data on that cookie which serves as a remember cookie on
    // the application. Once we have a user we can return it to the caller.
    $recaller = $this->getRecaller();
    if (is_null($user) && ! is_null($recaller))
    {
      $user = $this->getUserByRecaller($recaller);
    }
    return $this->user = $user;
}

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
基于OpenCV的PHP图像人脸识别技术
Oct 11 PHP
redis 队列操作的例子(php)
Apr 12 PHP
解析如何用php screw加密php源代码
Jun 20 PHP
php GUID生成函数和类
Mar 10 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
phpword插件导出word文件时中文乱码问题处理方案
Aug 19 PHP
php中fsockopen用法实例
Jan 05 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 PHP
php中final关键字用法分析
Dec 07 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 #PHP
Laravel框架实现redis集群的方法分析
Sep 14 #PHP
ThinkPHP开发--使用七牛云储存
Sep 14 #PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 #PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 #PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 #PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 #PHP
You might like
关于php mvc开发模式的感想
2011/06/28 PHP
PHP中读写文件实现代码
2011/10/20 PHP
php实现分页工具类分享
2014/01/09 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
Python字符转换
2008/09/06 Python
Python中的choice()方法使用详解
2015/05/15 Python
Python装饰器用法示例小结
2018/02/11 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
C语言50道问题
2014/10/23 面试题
环境科学毕业生自荐信
2013/11/21 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
员工安全承诺书
2014/05/22 职场文书
新闻报道策划方案
2014/06/11 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
活动新闻稿范文
2015/07/17 职场文书
python数字图像处理之图像的批量处理
2022/06/28 Python
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers