前言
這篇博文主要是帶大家瞭解laravel的授權系統,依照慣例,我會忽略一些細節,大家自己有興趣的話,自行閱讀。如果你仔細閱讀了我之前寫的,我覺得讀懂這篇博文,簡直不要太容易。
準備
在閱讀這篇部落格之前,你一定要閱讀《老司機帶你深入理解 Laravel 之 Facade》,這是必須的。
Auth Facade
我們的分析從Illuminate\Support\Facades\Auth
開始,下面是它的定義:
我們搜尋整個laravel專案,搜尋關鍵詞'Auth'
,在Illuminate\Auth\AuthServiceProvider
中可以看到:
這裡給Auth
註冊了一個單例,也就是說所有對Illuminate\Support\Facades\Auth
的操作實際上就是在操作Illuminate\Auth\AuthManager
類的例項物件,下面我以Auth::guard()
方法給大家分析,大家應該操作過這個方法吧。
這裡的getDefaultDriver
返回預設的驅動,我們來看看:
這裡直接讀取app/auth.php檔案的defaults
下的guard
,開啟我的配置檔案,可以看到:
返回到guard
方法中,繼續呼叫resolve
方法,如下:
這裡的getConfig
方法會讀取到下面的配置:
返回到resolve
方法中:
從這裡的分析可以看到createSessionDriver
方法被呼叫
首先這裡的createUserProvider
方法被呼叫,它的$config['provider']為users
,我們來看一下這個方法:
這裡的$config就是:
因為driver
是eloquent
,所以這裡會呼叫createEloquentProvider
方法:
也就是說createEloquentProvider
方法返回了一個\Illuminate\Auth\EloquentUserProvider
類的物件,我們再次回到createSessionDriver
方法中:
這裡建立了一個SessionGuard
類的物件,至此resolve
方法解析完畢,返回到guard
方法中,如果你需要驗證這一點的話,你可以在任何一個控制器中,執行dd(Auth::guard())
會返回一個SessionGuard
類的物件。
當我們授權使用者的時候,我們會使用到如下所示的程式碼:
/***
@var $guard SessionGuard
* **/
$guard = Auth::guest();
$guard->attempt(["name"=>"DennisRitche","password"=>"Goodbyte World"]);
根據上面的分析,SessionGuard
類的attempt
方法被呼叫:
這裡的provider
就是我們之前建立的Illuminate\Auth\EloquentUserProvider
類物件,我們看下它的retrieveByCredentials
方法:
上面的createModel
實際上就是建立一個我們之前配置的類的物件:
retrieveByCredentials
方法根據我們的使用者名稱從資料庫查詢出對應的記錄,返回到SessionGuard
類的attempt
方法中,繼續呼叫如下程式碼:
方法hasValidCredentials
作用就是驗證我們提交的密碼是否和資料庫裡面的密碼是相等(資料庫裡面的密碼加密過,所以在比較之前,使用者提交的密碼也需要經過加密步驟),這部分程式碼很簡單,這裡略過,如果hasValidCredentials
返回true
,表示驗證通過,此時login
方法被呼叫:
首先呼叫updateSession
方法會把當前登陸的使用者標識寫入到session中:
接下來呼叫setUser方法,如下:
這裡記錄了當前登入的使用者,以後每次Auth::user()
呼叫都會獲取到這個使用者例項。
總結
上面簡要的分析了Laravel的授權系統,程式碼本身並不複雜,我也是給大家介紹了一下分析的思路,很多細節,需要自己去分析和理解。我有一個QQ群,有興趣的可以加一下: