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 相关文章推荐
在PHP的图形函数中显示汉字
Oct 09 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
smarty获得当前url的方法分享
Feb 14 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
php中使用gd库实现远程图片下载实例
May 12 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
PHP pear安装配置教程
May 14 PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
php微信开发之关注事件
Jun 14 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
JavaScript 应用类库代码
2008/06/02 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
Python 登录网站详解及实例
2017/04/11 Python
python学习教程之使用py2exe打包
2017/09/24 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
详解Python locals()的陷阱
2019/03/26 Python
Python字符串的常见操作实例小结
2019/04/08 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
python实现猜单词游戏
2020/05/22 Python
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
写给学生的新学期寄语
2014/01/18 职场文书
项目合作协议书
2014/09/23 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL
python+opencv实现目标跟踪过程
2022/06/21 Python