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网站来路获取代码(针对搜索引擎)
Jun 08 PHP
关于session在PHP5的配置文件中的详细设置参数说明
Apr 20 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
Apr 26 PHP
php三维数组去重(示例代码)
Nov 26 PHP
如何使用php实现评委评分器
Jul 31 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
Laravel框架实现定时Task Scheduling例子
Oct 22 PHP
layui数据表格自定义每页条数limit设置
Oct 26 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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正则匹配汉字的方法介绍
2013/04/25 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
对table和ul实现js分页示例分享
2014/02/24 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
jQuery操作css样式
2017/05/15 jQuery
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
python简单实现刷新智联简历
2016/03/30 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
三八节主持词
2014/03/17 职场文书
教师评语大全
2014/04/28 职场文书
设计师求职信模板
2014/05/06 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
端午节活动总结报告
2015/02/11 职场文书
2015年推普周活动总结
2015/03/27 职场文书
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS