搜尋
首頁後端開發php教程laravel 的Auth類別有點疑問?

use Auth;

<code>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');
        }
    }

}</code>

這個Auth門面它是怎麼驗證的呢?沒有資料庫查詢,沒有程式碼具體可以看​​啊。 。

回覆內容:

use Auth;

<code>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');
        }
    }

}</code>

這個Auth門面它是怎麼驗證的呢?沒有資料庫查詢,沒有程式碼具體可以看​​啊。 。

Auth 類別是透過 class_alias 函數重新命名獲得的,原本是 IlluminateSupportFacadesAuth

不是很鼓勵 @granton 那種透過laravel ide helper 的方式查看,不利於學習(當然,這是一種技巧,只是不太適合正在學習的新人,倒是適合在專案開發中快速定位源,因為我就是這麼做的)。

繼續,如果真想要理解整個框架中類似這類的問題,就是順著框架走一遍,不但學得快,還能發現一些新大陸。這裡針對問題只提文件中所說的部分:服務提供者、服務容器、門面模式。

Facade 指門面模式,開頭我提了那個 Auth 的源頭,是一個 Facade,查看源代碼,實際發揮作用的就一行,你如果願意去看的話,實際上就是一個方法返回一個文本字符串。我建議你去閱讀文件關於服務提供者 的部分,那個地方是構建框架功能的核心,利用服務提供者在服務容器 註冊一個AuthManager 的供應者,在調用Facade 時,Facade 根據那個方法返回的字串會自動解析產生出AuthManager 實例(嚴格上講,AuthManager 是一個單例,透過其註冊的Provider 可查)。 AuthManager 提供了 Auth 這個 Facade 的所有功能,包括自動(根據配置)選擇驅動,由驅動提供給你這些如 attempt、login、check 這些方法。

如果你仔細閱讀完任何一個功能的文檔,尤其是 laravel 自身組件的,你都會發現他們支持擴展,擴展的方式也是利用服務容器,這是框架的核心。擴展你說的方法、改變加密方式非常簡單。

多讀文檔。

2016-07-27 補充:

只要明白這個框架的運作機制就很容易懂,實際上不複雜,大致如下(忽略不是很重要的細節,具體可以閱讀源碼):

  1. 建立 IlluminateFoundationApplication 實例;

  2. (適用於 Web 應用)建立 Http 核心實例 AppHttpKernel ---> IlluminateFoundationHttpKernel箭頭表示繼承關係

  3. 註冊服務提供者,並執行裡面的註冊行為,認證元件(IlluminateAuthAuthManager)就是在

    IlluminateAuthAuthServiceProvider
  4. 中被註冊,註冊完畢執行後續操作;
  5. 後續服務啟動,如中介軟體載入、路由分發、回應處理,至此完成流程。

上述流程中提到了一個 服務提供者(Service Provider),就是 IlluminateAuthAuthServiceProvider,可以看到在項目配置 config/app.php 中被註冊,裡面有一段重點:

<code>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();
    });
}</code>

可以看到註冊了一個名為auth 的單例,是一個IlluminateAuthAuthManager 對象,我們所有透過Auth 類別存取的方法功能都由其提供,而Auth重新命名得到的類,實際上訪問Auth 就等於訪問IlluminateSupportFacadesAuthIlluminateSupportFacadesAuth 是一個Facade 的繼承,提供了​​一個方法,查看源代碼:

<code>class Auth extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'auth';
    }
}</code>
注意到那個 return 'auth'; 沒,這個回傳值就是

Service Provider 中註冊的那個。為何 Facade 類別能夠擁有其指向的物件的方法?實際上是利用了魔術方法 __callStatic,可透過查看 IlluminateSupportFacadesFacade 原始碼得知。文檔也提到過。

至于你们去查看 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进行数据查询和匹配

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
laravel单点登录方法详解laravel单点登录方法详解Jun 15, 2022 am 11:45 AM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于单点登录的相关问题,单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,下面一起来看一下,希望对大家有帮助。

一起来聊聊Laravel的生命周期一起来聊聊Laravel的生命周期Apr 25, 2022 pm 12:04 PM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于Laravel的生命周期相关问题,Laravel 的生命周期从public\index.php开始,从public\index.php结束,希望对大家有帮助。

laravel中guard是什么laravel中guard是什么Jun 02, 2022 pm 05:54 PM

在laravel中,guard是一个用于用户认证的插件;guard的作用就是处理认证判断每一个请求,从数据库中读取数据和用户输入的对比,调用是否登录过或者允许通过的,并且Guard能非常灵活的构建一套自己的认证体系。

laravel中asset()方法怎么用laravel中asset()方法怎么用Jun 02, 2022 pm 04:55 PM

laravel中asset()方法的用法:1、用于引入静态文件,语法为“src="{{asset(‘需要引入的文件路径’)}}"”;2、用于给当前请求的scheme前端资源生成一个url,语法为“$url = asset('前端资源')”。

实例详解laravel使用中间件记录用户请求日志实例详解laravel使用中间件记录用户请求日志Apr 26, 2022 am 11:53 AM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于使用中间件记录用户请求日志的相关问题,包括了创建中间件、注册中间件、记录用户访问等等内容,下面一起来看一下,希望对大家有帮助。

laravel中间件基础详解laravel中间件基础详解May 18, 2022 am 11:46 AM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于中间件的相关问题,包括了什么是中间件、自定义中间件等等,中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制,下面一起来看一下,希望对大家有帮助。

laravel的fill方法怎么用laravel的fill方法怎么用Jun 06, 2022 pm 03:33 PM

在laravel中,fill方法是一个给Eloquent实例赋值属性的方法,该方法可以理解为用于过滤前端传输过来的与模型中对应的多余字段;当调用该方法时,会先去检测当前Model的状态,根据fillable数组的设置,Model会处于不同的状态。

laravel路由文件在哪个目录里laravel路由文件在哪个目录里Apr 28, 2022 pm 01:07 PM

laravel路由文件在“routes”目录里。Laravel中所有的路由文件定义在routes目录下,它里面的内容会自动被框架加载;该目录下默认有四个路由文件用于给不同的入口使用:web.php、api.php、console.php等。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版