Laravel多使用者認證系統

來源:互聯網
上載者:User
自從Laravel5.2開始,內建的Auth認證系統可以支援多個角色認證了。就是說你比如果有管理員、普通使用者這兩種角色,都可以通過同一個Auth系統來實現認證。

#1 自動產生代碼Laravel內建的Auth可以通過一行命令來產生相關的認證控制器、模版以及路由:

php artisan make:auth

這樣就會產生一個AuthController認證控制器和HomeController通用控制器,這個控制器沒什麼用,就是登入成功後跳轉的;還有就是一些登入註冊需要的模版檔案,在resource/view裡面看看就知道了;而且還會在路由檔案中產生相關認證路由,原始碼在\Illuminate\Routing\Router::auth();,其實就是配置了一些登入註冊用的:

public function auth() {      // Authentication Routes...     $this->get('login', 'Auth\AuthController@showLoginForm');     $this->post('login', 'Auth\AuthController@login');     $this->get('logout', 'Auth\AuthController@logout');      // Registration Routes...     $this->get('register', 'Auth\AuthController@showRegistrationForm');     $this->post('register', 'Auth\AuthController@register');      // Password Reset Routes...     $this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');     $this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail');     $this->post('password/reset', 'Auth\PasswordController@reset'); }

#2 auth.php檔案配置這個是和認證相關的設定檔,估計很多人看不懂裡面一些概念,比如說guard以及provider這些,文檔也基本上是沒寫。那麼guard到底是什麼東西呢?這個可以理解為就是一個角色,在guards數組中的每一項都是一個角色,預設的有web和api兩種,這就表示了當前有這兩種角色會使用到認證系統。當然,這兩種肯定是不會滿足我們要求的,所以我們一般都會自訂一些guard。自訂也很簡單,就是在guards數組增加一項,其中driver就是表示這個認證要怎麼去儲存使用者狀態,一般是儲存在session中,而provider就是下面provider數組的一項,那麼provider又是什麼鬼呢?這個更好理解了,你要實現使用者認證肯定要儲存使用者名稱密碼對吧,那麼provider就是告訴Laravel你的使用者資訊儲存在哪一張表裡面,driver就是告訴了要使用那種方式來操作資料庫。

#3 認證其實Laravel自動產生的程式碼已經可以滿足登入註冊的需求了,但是每一個guard都需要一個AuthController來,那麼如何公用一個認證控制器呢?這裡就是用到guard這個東西了,因為可以表示使用者身份來進行不同的邏輯。但是,在認證控制器中無法擷取到這guard,所以我們可以通過路由參數的方式來實現。定義一個路由群組:

Route::group(['prefix'=>'{guard}'],function(){ Route::auth();});

在這個路由群組中我們設定首碼為guard參數,這樣就可以在AuthController中擷取到當前的guard了。一般情況下我們擷取路由參數都是通過依賴注入Request執行個體來擷取,但是這裡也有一個坑那就是我在5.1版本之前路由參數都可以通過

$request->input('key')

這樣來擷取,但是在5.2中已經不行了,必須通過

$request->key

來擷取,或者就是直接從路由執行個體中擷取,不知道這是什麼原因。在AuthController控制器中使用了一些trait,這些trait就是實現了認證註冊的邏輯,可以通過重寫一些控制器的屬性來自訂邏輯。包括$redirectTo還有$guard以及$username等等,這些一看就知道第一個是登入成功後跳轉,第二個就是定義當前使用的guard,第三個就是認證使用的使用者名稱欄位。所以我們可以在認證控制器中通過擷取到的guard來自訂。

#4 路由保護一般做認證系統的,都是要來保護路由的,那麼如何保護路由呢?文檔裡面說給需要保護的路由添加一個auth中介軟體,那麼事實是怎樣的呢?事實也確實是這樣,不過文檔沒有說的一點是,通過auth中介軟體保護的路由必須還要加上web中介軟體必須還要加上web中介軟體必須還要加上web中介軟體,重要的事情要說三遍啊,不然會出現什麼問題呢?不管你認證成功失敗都是會跳轉到/這條路由,這個大坑要注意!當然你也可以在中介軟體中指定guard來讓Laravel知道通過那個來認證,如果沒指定的話就是使用設定檔裡面預設的:

Route::get('profile', [ 'middleware' => 'auth:api', 'uses' => 'ProfileController@show']);

#5 擷取使用者執行個體通過認證後就可以通過Auth門面來擷取到當前通過認證的使用者執行個體。

$user = Auth::user();

這裡還有一個要注意的是,以上的方式預設擷取的是設定檔中的guard的,假如你當前登入的guard不是設定檔中的,就必須要這樣子來擷取:

$user = Auth::guard('guard')->user();

#6 總結總得來說,Laravel5.2內建的Auth系統還是很好用的,只是有一些小坑文檔沒說清楚,用過幾次之後就可以很熟悉了,可以給我們節約很多的開發時間。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.