0

0

laravel 的Auth类有点疑问?

php中文网

php中文网

发布时间:2016-08-04 09:20:17

|

1177人浏览过

|

来源于php中文网

原创

php namespace apphttpcontrollers;

use Auth;

use Illuminate\Routing\Controller;

class AuthController extends Controller {

    /**
     * Handle an authentication attempt.
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password]))
        {
            return redirect()->intended('dashboard');
        }
    }

}

这个Auth门面它是怎么验证的呢?没有数据库查询,没有代码具体可以看啊。。

回复内容:

use Auth;

use Illuminate\Routing\Controller;

class AuthController extends Controller {

    /**
     * Handle an authentication attempt.
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password]))
        {
            return redirect()->intended('dashboard');
        }
    }

}

这个Auth门面它是怎么验证的呢?没有数据库查询,没有代码具体可以看啊。。

Auth 类是通过 class_alias 函数重命名获得的,原本是 Illuminate\Support\Facades\Auth

不是很鼓励 @granton 那种通过 laravel ide helper 的方式查看,不利于学习(当然,这是一种技巧,只是不太适合正在学习的新人,倒是适合在项目开发中快速定位源,因为我就是这么做的)。

继续,如果真想要理解整个框架中类似这类的问题,就是顺着框架走一遍,不但学得快,还能发现一些新大陆。在这里针对问题只提文档中说过的部分:服务提供者、服务容器、门面模式。

Facade 指门面模式,开头我提了那个 Auth 的源头,是一个 Facade,查看源代码,实际发挥作用的就一行,你如果愿意去看的话,实际就是一个方法返回一个文本字符串。我建议你去阅读文档关于 服务提供者 的部分,那个地方是构建框架功能的核心,利用服务提供者在 服务容器 注册一个 AuthManager 的供应者,在调用 Facade 时,Facade 根据那个方法返回的字符串自动解析生成出 AuthManager 实例(严格上讲,AuthManager 是一个单例,通过其注册的 Provider 可查)。AuthManager 提供了 Auth 这个 Facade 的所有功能,包括自动(根据配置)选择驱动,由驱动提供给你这些如 attempt、login、check 这些方法。

如果你仔细阅读完任何一个功能的文档,尤其是 laravel 自身组件的,你都会发现他们支持扩展,扩展的方式也是利用服务容器,这是框架的核心。扩展你说的方法、改变加密方式非常简单。

多读文档。

2016-07-27 补充:

只要明白这个框架的运行机制就很容易懂,实际上不复杂,大致如下(忽略不是很重要的细节,具体可以阅读源码):

  1. 创建 Illuminate\Foundation\Application 实例;

  2. (对于 Web 应用)创建 Http 核心实例 App\Http\Kernel ---> Illuminate\Foundation\Http\Kernel箭头表示继承关系

  3. 注册服务提供者,并执行里面的注册行为,认证组件(Illuminate\Auth\AuthManager)就是在Illuminate\Auth\AuthServiceProvider 中被注册,注册完毕执行后续操作;

    LHT蓝海豚团购导航
    LHT蓝海豚团购导航

    Lht蓝海豚(大维)团购导航系统是一套开源程序,采用PHP+MySql平台开发,具有强大的多规则API采集功能、精确化引导消费功能,卓越的负载能力和访问速度,全面支持第三方整合(微博、短信等)前台功能团购名站:显示分类下的所有团购网站,点击团购站,可直接进行查看、推荐、收藏精品商城:为网民推荐展示非团购网站的网上商城今日团购:显示各团购网站正在进行的团购团购排行:今日团购商品可按价格、行业、折扣、

    下载
  4. 后续服务启动,如中间件加载、路由分发、响应处理,至此完成流程。

上述流程中提到了一个 服务提供者(Service Provider),就是 Illuminate\Auth\AuthServiceProvider,可以看到在项目配置 config/app.php 中被注册,里面有一段重点:

protected function registerAuthenticator()
{
    $this->app->singleton('auth', function ($app) {
        $app['auth.loaded'] = true;
        return new AuthManager($app);
    });

    $this->app->singleton('auth.driver', function ($app) {
        return $app['auth']->guard();
    });
}

可以看到注册了一个名为 auth 的单例,是一个 Illuminate\Auth\AuthManager 对象,我们所有通过 \Auth 类访问的方法功能都由其提供,而 \Auth 类是一个由 class_alias 重命名得到的类,实际上访问 \Auth 就等于访问 Illuminate\Support\Facades\AuthIlluminate\Support\Facades\Auth 是一个 Facade 的继承,提供了一个方法,查看源代码:

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

注意到那个 return 'auth'; 没,这个返回值就是 Service Provider 中注册的那个。为何 Facade 类能够拥有其指向的对象的方法?实际上是利用了魔术方法 __callStatic,可通过查看 Illuminate\Support\Facades\Facade 源码得知。文档也提到过。

至于你们去查看 AuthManager 并没发现一些可被执行的方法,实际上是因为 AuthManager 下还有一系列驱动(Driver),这些驱动使得 Auth 组件高度可定制化,文档上对这块做了着重讲解,驱动由两类构成,分别是实现了 Illuminate\Contracts\Auth\UserProvider 接口和 Illuminate\Contracts\Auth\Authenticatable 接口的类的实例,后者是用于提供认证组件获取认证对象信息的接口,比如获取账户、密码的方法,前者则是你们关注的,尤其是 retrieveByCredentialsvalidateCredentials 这两个接口方法,retrieveByCredentials 用于根据 attempt 传入的凭据获取用户实例的,validateCredentials 适用于验证凭据是否有效(想改变密码验证方式的就是通过该处实现)。

关于如何扩展、定制 Auth 组件,文档有说明,so~~~多读文档,这种问题读了文档,自然解决。不是简单看就完了,做到我说到任何一点你都知道在文档哪里去找,才说明你真的是读了文档的。我上面所提的所有,文档都写了。。。

以上。

如果使用 ide-helper, 可以在 _ide_helper.php 中看到这段代码

class Auth extends \Illuminate\Support\Facades\Auth{
    // ...
}

其中

/**
 * Attempt to authenticate a user using the given credentials.
 *
 * @param array $credentials
 * @param bool $remember
 * @param bool $login
 * @return bool 
 * @static 
 */
public static function attempt($credentials = array(), $remember = false, $login = true){
    return \Illuminate\Auth\SessionGuard::attempt($credentials, $remember, $login);
}

也就是说,这个 attempt 方法调用的是 \Illuminate\Auth\SessionGuard::attempt($credentials, $remember, $login) 方法。

具体的登陆验证的逻辑在里面。

config里的auth.php里配置了数据模型的吧,指定了model进行数据查询和匹配

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号