[TOC]
### **1、簡介**
[Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel")?中實現[用戶](http://laravelacademy.org/tags/%e7%94%a8%e6%88%b7 "View all posts in 用戶")[認證](http://laravelacademy.org/tags/%e8%ae%a4%e8%af%81 "View all posts in 認證")非常簡單。實際上,幾乎所有東西都已經為你配置好了。配置文件位于`config/auth.php`,其中包含了用于調整認證服務行為的、[文檔](http://laravelacademy.org/tags/%e6%96%87%e6%a1%a3 "View all posts in 文檔")友好的選項配置。
在底層代碼中,Laravel 的認證組件由“guards”和“providers”組成,[Guard](http://laravelacademy.org/tags/guard "View all posts in Guard")?定義了用戶在每個請求中如何實現認證,例如,Laravel 通過?`session`?guard來維護?[Session](http://laravelacademy.org/tags/session "View all posts in Session")?存儲的狀態、Cookie 以及?`token`?guard,`token`?guard 是認證用戶發送請求時帶的“API token”。
[Provider](http://laravelacademy.org/tags/provider "View all posts in Provider")?定義了如何從持久化存儲中獲取用戶信息,Laravel 底層支持通過 Eloquent 和數據庫查詢構建器兩種方式來獲取用戶,如果需要的話,你還可以定義額外的 Provider。
如果看到這些名詞覺得云里霧里,大可不必太過擔心,因為對絕大多數應用而言,只需使用默認認證配置即可,不需要做什么改動。
#### **數據庫考量**
默認情況下,Laravel 在?`app`?目錄下包含了一個?[Eloquent](http://laravelacademy.org/post/2995.html)?模型`App\User`,這個模型可以和默認的 Eloquent 認證驅動一起使用。如果你的應用不使用 Eloquent,你可以使用?`database`認證驅動,該驅動使用了 Laravel 查詢構建器。
為?`App\User`?模型構建數據庫表結構的時候,確保?`password`?字段長度至少有60位。
還有,你應該驗證?`users`?表包含了可以為空的、字符串類型的?`remember_token`?字段長度為100,該字段用于存儲被應用維護的”記住我(remember me)“的 Session 令牌,這可以通過在遷移中使用?`$table->rememberToken();`來實現。
### **2、快速入門**
Laravel 開箱提供了兩個認證控制器,位于?`App\Http\Controllers\[Auth](http://laravelacademy.org/tags/auth "View all posts in Auth")`?命名空間下,`AuthController`?處理新用戶[注冊](http://laravelacademy.org/tags/%e6%b3%a8%e5%86%8c "View all posts in 注冊")和[登錄](http://laravelacademy.org/tags/%e7%99%bb%e5%bd%95 "View all posts in 登錄"),`PasswordController`?用于幫助用戶找回密碼。每個控制器都使用 trait 來引入它們需要的方法。對很多應用而言,你根本不需要修改這兩個控制器。
#### **路由**
Laravel 通過運行如下命令可快速生成認證所需要的路由和視圖:
~~~
php?artisan?make:auth
~~~
運行該命令會生成注冊和登錄視圖,以及所有的認證路由,同時生成?`HomeController`?,因為登錄成功后會跳轉到該控制器下的動作。當然,你也可以不用這個命令根據應用需求完全自定義或者移除這個控制器。
#### **視圖**
正如上面所提到的,`php artisan make:auth`?命令會在?`resources/views/auth`?目錄下創建所有認證需要的視圖。
`make:auth`?命令還創建了?`resources/views/layouts`?目錄,該目錄下包含了應用的基礎布局文件。所有這些視圖都使用了 Bootstrap CSS 框架,你也可以根據需要對其進行自定義。
#### **認證**
現在你已經為自帶的認證控制器設置好了路由和視圖,接下來我們來實現新用戶注冊和登錄認證。你可以在瀏覽器中訪問定義好的路由,認證控制器默認已經包含了注冊及登錄邏輯(通過trait)。
##### **自定義路徑**
當一個用戶成功進行登錄認證后,默認將會跳轉到`/`,你可以通過在?`AuthController`?中設置?`redirectTo`屬性來自定義登錄認證成功之后的跳轉路徑:
~~~
protected?$redirectTo?=?'/home';
~~~
當一個用戶登錄認證失敗后,默認將會跳轉回登錄表單對應的頁面。
##### **自定義Guard**
你還可以自定義實現用戶認證的“guard”,要實現這一功能,需要在?`AuthController`?中定義?`guard`?屬性,該屬性的值對應認證配置文件?`auth.php`?中的相應 guard 配置:
~~~
protected?$guard?=?'admin';
~~~
##### **自定義驗證/存儲**
要修改新用戶注冊所必需的表單字段,或者自定義新用戶字段如何存儲到數據庫,你可以修改?`AuthController`?類。該類負責為應用驗證輸入參數和創建新用戶。
`AuthController`?的?`validator`?方法包含了新用戶的驗證規則,你可以按需要自定義該方法。
`AuthController`?的?`create`?方法負責使用?[Eloquent ORM](http://laravelacademy.org/post/2995.html)?在數據庫中創建新的?`App\User`?記錄。當然,你也可以基于自己的需要自定義該方法。
#### **獲取認證用戶**
你可以通過?`Auth`?門面訪問認證用戶:
~~~
$user?=?Auth::user();
~~~
此外,用戶通過認證后,你還可以通過?`Illuminate\Http\Request`?實例訪問認證用戶:
~~~
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class ProfileController extends Controller{
/**
* 更新用戶屬性.
*
* @param Request $request
* @return Response
*/
public function updateProfile(Request $request)
{
if ($request->user()) {
// $request->user() 返回認證用戶實例...
}
}
}
~~~
##### **判斷當前用戶是否通過認證**
要判斷某個用戶是否登錄到應用,可以使用?`Auth`?[門面](http://laravelacademy.org/post/2920.html)的?`check`方法,如果用戶通過認證則返回?`true`:
~~~
if (Auth::check()) {
// The user is logged in...
}
~~~
此外,你還可以在用戶訪問特定路由/控制器之前使用中間件來驗證用戶是否通過認證,想要了解更多,可以查看下面的路由保護:
#### **路由保護**
[路由中間件](http://laravelacademy.org/post/2803.html)可用于只允許通過認證的用戶訪問給定路由。Laravel 通過定義在`app\Http\Middleware\Authenticate.php`?的?`auth`?中間件來處理這一操作。你所要做的僅僅是將該中間件加到相應的路由定義中:
~~~
// 使用路由閉包...
Route::get('profile', ['middleware' => 'auth', function() {
// 只有認證用戶可以進入...
}]);
// 使用控制器...
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'ProfileController@show'
]);
~~~
當然,如果你正在使用[控制器類](http://laravelacademy.org/post/2816.html),也可以在控制器的構造方法中調用?`middleware`?方法而不是在路由器中直接定義:
~~~
public?function?__construct(){
$this->middleware('auth');
}
~~~
##### **指定一個Guard**
添加?`auth`?中間件到路由后,還需要指定使用哪個 guard 來實現認證:
~~~
Route::get('profile',?[
'middleware'?=>?'auth:api',
'uses'?=>?'ProfileController@show'
]);
~~~
指定的 guard 對應配置文件?`auth.php?`中?`guards`?數組的某個鍵。
#### **登錄失敗次數限制**
如果你使用了 Laravel 內置的?`AuthController`?類, 可以使用`Illuminate\Foundation\Auth\ThrottlesLogins`?trait 來限制用戶登錄失敗次數。默認情況下,用戶在幾次登錄失敗后將在一分鐘內不能登錄,這種限制基于用戶的用戶名/郵箱地址+IP地址:
~~~
<?php
namespace App\Http\Controllers\Auth;
use App\User;use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
class AuthController extends Controller{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
// AuthController類的其它部分...
}
~~~
### **3、手動認證用戶**
當然,你也可以不使用 Laravel 自帶的認證控制器。如果你選擇移除這些控制器,你需要直接使用 Laravel 認證類來管理用戶認證。別擔心,這很簡單!
我們將會通過?`Auth`?門面來訪問認證服務,因此我們需要確保在類的頂部導入了?`Auth`?門面,讓我們看看?`attempt`方法:
~~~
<?php
namespace App\Http\Controllers;
use Auth;
use Illuminate\Routing\Controller;
class AuthController extends Controller{
/**
* 處理登錄認證
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// 認證通過...
return redirect()->intended('dashboard');
}
}
}
~~~
`attempt`?方法接收鍵值數組對作為第一個參數,數組中的值被用于從數據表中查找用戶,因此,在上面的例子中,用戶將會通過`email`?的值獲取,如果用戶被找到,經哈希運算后存儲在數據中的密碼將會和傳遞過來的經哈希運算處理的密碼值進行比較。如果兩個經哈希運算的密碼相匹配那么將會為這個用戶開啟一個認證Session。
如果認證成功的話?`attempt`?方法將會返回?`true`。否則,返回?`false`。
重定向器上的?`intended`?方法將用戶重定向到登錄之前用戶想要訪問的 URL,在目標 URL 無效的情況下備用 URI 將會傳遞給該方法。
##### **指定額外條件**
如果需要的話,除了用戶郵件和密碼之外還可以在認證查詢時添加額外的條件,例如,我們可以驗證被標記為有效的用戶:
~~~
if?(Auth::attempt(['email'?=>?$email,?'password'?=>?$password,?'active'?=>?1]))?{
//?The?user?is?active,?not?suspended,?and?exists.
}
~~~
> 注:在這些例子中,并不僅僅限于使用 email 進行登錄認證,這里只是作為演示示例,你可以將其修改為數據庫中任何其他可用作“username”的字段。
##### **訪問指定 Guard 實例**
你可以使用?`Auth`?門面的?`guard`?方法指定想要使用的 guard 實例,這種機制允許你在同一個應用中對不同的認證模型或用戶表實現完全獨立的用戶認證。
傳遞給?`guard`?方法的 guard 名稱對應配置文件?`auth.php`?中?`guards`?配置的某個鍵:
~~~
if?(Auth::guard('admin')->attempt($credentials))?{
//
}
~~~
##### **[退出](http://laravelacademy.org/tags/%e9%80%80%e5%87%ba "View all posts in 退出")**
要退出應用,可以使用?`Auth`?門面的?`logout`?方法,這將會清除用戶 Session 中的認證信息:
~~~
Auth::logout();
~~~
#### **記住用戶**
如果你想要在應用中提供“記住我”的功能,可以傳遞一個布爾值作為第二個參數到?`attempt`?方法,這樣用戶登錄認證狀態就會一直保持直到他們手動退出。當然,你的?`users`?表必須包含?`remember_token`?字段,該字段用于存儲“記住我”令牌。
~~~
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// The user is being remembered...
}
~~~
如果你要“記住”用戶,可以使用?`viaRemember`?方法來判斷用戶是否使用“記住我”cookie進行認證:
~~~
if (Auth::viaRemember()) {
//
}
~~~
#### **其它認證方法**
##### **認證一個用戶實例**
如果你需要將一個已存在的用戶實例登錄到應用中,可以調用?`Auth`?門面的?`login`?方法并傳入用戶實例,傳入實例必須是`Illuminate\Contracts\Auth\Authenticatable`?契約的實現,當然,Laravel 自帶的?`App\User`?模型已經實現了該接口:
~~~
Auth::login($user);
~~~
##### **通過ID認證用戶**
要通過用戶ID登錄到應用,可以使用?`loginUsingId`?方法,該方法接收你想要認證用戶的主鍵作為參數:
~~~
Auth::loginUsingId(1);
~~~
##### **一次性認證用戶**
你可以使用?`once`?方法只在單個請求中將用戶登錄到應用,而不存儲任何 Session 和 Cookie,這在構建無狀態的 API 時很有用。`once`方法和`attempt`方法用法差不多:
~~~
if (Auth::once($credentials)) {
//
}
~~~
### **4、基于?[HTTP](http://laravelacademy.org/tags/http "View all posts in HTTP")?的基本認證**
[HTTP基本認證](http://en.wikipedia.org/wiki/Basic_access_authentication)能夠幫助用戶快速實現登錄認證而不用設置專門的登錄頁面,首先要在路由中加上?`auth.basic`?[中間件](http://laravelacademy.org/post/2803.html)。該中間件是 Laravel 自帶的,所以不需要自己定義:
~~~
Route::get('profile', ['middleware' => 'auth.basic', function() {
// 只有認證用戶可以進入...
}]);
~~~
中間件加到路由中后,當在瀏覽器中訪問該路由時,會自動提示需要認證信息,默認情況下,`auth.basic`?中間件使用用戶記錄上的?`email`?字段作為“用戶名”。
##### **FastCGI上注意點**
如果你使用 PHP FastCGI,HTTP 基本認證將不能正常工作,需要在?`.htaccess`?文件加入如下內容:
~~~
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
~~~
#### **無狀態的HTTP基本認證**
使用 HTTP 基本認證也不需要在 Session 中設置用戶標識 Cookie,這在 API 認證中非常有用。要實現這個,需要定義一個調用?`onceBasic`?方法的中間件。如果該方法沒有返回任何響應,那么請求會繼續走下去:
~~~
<?php
namespace Illuminate\Auth\Middleware;
use Auth;
use Closure;
class AuthenticateOnceWithBasicAuth{
/**
* 處理輸入請求.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return Auth::onceBasic() ?: $next($request);
}
}
~~~
接下來,注冊路由中間件并將其添加到路由中:
~~~
Route::get('api/user', ['middleware' => 'auth.basic.once', function() {
// 只有認證用戶可以進入...
}]);
~~~
### **5、重置密碼**
#### **數據庫考量**
大多數 web 應用提供了用戶重置密碼的功能,Laravel 提供了便利方法用于發送密碼提示及執行[密碼重置](http://laravelacademy.org/tags/%e5%af%86%e7%a0%81%e9%87%8d%e7%bd%ae "View all posts in 密碼重置")而不需要你在每個應用中重新實現。
開始之前,先驗證?`App\User`?模型實現了?`Illuminate\Contracts\Auth\CanResetPassword`?契約。當然,Laravel 自帶的?`App\User`?模型已經實現了該接口,并使用?`Illuminate\Auth\Passwords\CanResetPassword`?trait來包含實現該接口需要的方法。
##### **生成重置令牌表遷移**
接下來,用來存儲密碼重置令牌的表必須被創建,Laravel 已經自帶了這張表的遷移,就存放在`database/migrations`?目錄。所有,你所要做的僅僅是運行遷移:
~~~
php artisan migrate
~~~
#### **路由**
Laravel 自帶了?`Auth\PasswordController`,其中包含了重置用戶密碼的相應邏輯。重置密碼所需的路由都已經通過`make:auth`?命令自動生成了:
~~~
php?artisan?make:auth
~~~
#### **視圖**
和路由一樣,重置密碼所需的視圖文件也通過?`make:auth`?命令一并生成了,這些視圖文件位于`resources/views/auth/passwords`?目錄下,你可以按照所需對生成的文件進行相應修改。
#### **重置密碼后**
定義好重置用戶密碼路由和視圖后,只需要在瀏覽器中訪問這些路由即可。框架自帶的?`PasswordController`?已經包含了發送密碼重置鏈接郵件以及更新數據庫中密碼的邏輯。
密碼被重置后,用戶將會自動登錄到應用并重定向到?`/home`。你可以通過定義上?`PasswordController`?的`redirectTo`?屬性來自定義密碼重置成功后的跳轉鏈接:
~~~
protected $redirectTo = '/dashboard';
~~~
> 注意:默認情況下,密碼重置令牌一小時內有效,你可以通過修改?`config/auth.php`?文件中的選項`reminder.expire`?來改變有效時間。
#### **自定義**
##### **自定義認證 Guard**
在配置文件?`auth.php`?中,可以配置多個”guards“,以便用于實現多用戶表獨立認證,你可以通過添加?`$guard`?屬性到自帶的?`PasswordController`?控制器的方法來使用你選擇的 guard:
~~~
/**
*?The?authentication?guard?that?should?be?used.
*
*?@var?string
*/
protected?$guard?=?'admins';
~~~
##### **自定義密碼 broker**
在配置文件?`auth.php`?中,可以配置多個密碼,以便用于重置多個用戶表的密碼 broker,同樣,可以通過在自帶的`PasswordController`?控制器中添加?`$broker`?屬性來使用你選擇的 broker:
~~~
/**
*?The?password?broker?that?should?be?used.
*
*?@var?string
*/
protected?$broker?=?'admins';
~~~
### **6、社會化登錄認證**
Laravel 中還可以使用?[Laravel Socialite](http://laravelacademy.org/post/1305.html)?通過 OAuth 提供者進行簡單、方便的認證,也就是社會化登錄,目前支持使用Facebook、Twitter、LinkedIn、GitHub和Bitbucket進行登錄認證。
要使用社會化登錄,需要在?`composer.json`?文件中添加依賴:
~~~
composer require laravel/socialite
~~~
#### **配置**
安裝完社會化登錄庫后,在配置文件?`config/app.php`?中注冊`Laravel\Socialite\SocialiteServiceProvider`:
~~~
'providers' => [
// 其它服務提供者...
Laravel\Socialite\SocialiteServiceProvider::class,
],
~~~
還要在?`app`?配置文件中添加?`Socialite門面到?`aliases`?數組:`
~~~
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
~~~
你還需要為應用使用的 OAuth 服務添加認證信息,這些認證信息位于配置文件?`config/services.php`,而且鍵為`facebook`,?`twitter`,`linkedin`,?`google`,?`github`或`bitbucket`,這取決于應用需要的提供者。例如:
~~~
'github' => [
'client_id' => 'your-github-app-id',
'client_secret' => 'your-github-app-secret',
'redirect' => 'http://your-callback-url',
],
~~~
#### **基本使用**
接下來,準備好認證用戶!你需要兩個路由:一個用于重定向用戶到 OAuth 提供者,另一個用戶獲取認證后來自提供者的回調。我們使用?`Socialite`?門面訪問 Socialite?:
~~~
<?php
namespace App\Http\Controllers;
use Socialite;
use Illuminate\Routing\Controller;
class AuthController extends Controller{
/**
* 將用戶重定向到GitHub認證頁面.
*
* @return Response
*/
public function redirectToProvider()
{
return Socialite::driver('github')->redirect();
}
/**
* 從GitHub獲取用戶信息.
*
* @return Response
*/
public function handleProviderCallback()
{
$user = Socialite::driver('github')->user();
// $user->token;
}
}
~~~
`redirect`?方法將用戶發送到 OAuth 提供者,`user`?方法讀取請求信息并從提供者中獲取用戶信息,在重定向用戶之前,你還可以在請求上使用?`scope`?方法設置”作用域”,該方法將會重寫已存在的所有作用域:
~~~
return Socialite::driver('github')
->scopes(['scope1', 'scope2'])->redirect();
~~~
當然,你需要定義路由到控制器方法:
~~~
Route::get('auth/github', 'Auth\AuthController@redirectToProvider');
Route::get('auth/github/callback', 'Auth\AuthController@handleProviderCallback');
~~~
##### **獲取用戶信息**
有了用戶實例之后,可以獲取用戶的更多詳情:
~~~
$user = Socialite::driver('github')->user();
// OAuth Two Providers
$token = $user->token;
// OAuth One Providers
$token = $user->token;
$tokenSecret = $user->tokenSecret;
// All Providers
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
~~~
### **7、添加自定義的 Guard**
你可以通過?`Auth`?門面的?`extend`?方法定義自己的認證 guard,該功能需要在某個服務提供者的?`boot`?方法中實現:
~~~
<?php
~~~
正如你在上述例子中所看到的,傳遞給?`extend`?方法的閉包回調需要返回?`Illuminate\Contracts\Auth\Guard`?的實現實例,該接口包含了自定義認證 guard 需要的一些方法。
定義好自己的認證 guard 之后,可以在配置文件的?`guards`?配置中使用話這個 guard:
~~~
'guards'?=>?[
'api'?=>?[
'driver'?=>?'jwt',
'provider'?=>?'users',
],
],
~~~
### **8、添加自定義用戶提供者**
如果你沒有使用傳統的關系型數據庫存儲用戶信息,則需要使用自己的認證用戶提供者來擴展 Laravel。我們使用 Auth[門面](http://laravelacademy.org/post/2920.html)上的?`provider`?方法定義自定義該提供者,在[服務提供者](http://laravelacademy.org/post/2900.html)調用?`provider`?方法如下:
~~~
<?php
~~~
通過?`provider`?方法注冊用戶提供者后,你可以在配置文件?`config/auth.php`?中切換到新的用戶提供者。首先,在該配置文件定義一個使用新驅動的?`providers`?數組:
~~~
'providers'?=>?[
'users'?=>?[
'driver'?=>?'riak',
],
],
~~~
然后,可以在你的?`guards`?配置中使用這個提供者:
~~~
'guards'?=>?[
'web'?=>?[
'driver'?=>?'session',
'provider'?=>?'users',
~~~
#### **UserProvider 契約**
`Illuminate\Contracts\Auth\UserProvider`?實現只負責從持久化存儲系統中獲取`Illuminate\Contracts\Auth\Authenticatable`?實現,例如MySQL、Riak等等。這兩個接口允許 Laravel 認證機制繼續起作用而不管用戶數據如何存儲或者何種類來展現。
讓我們先看看?`Illuminate\Contracts\Auth\UserProvider`契約:
~~~
<?php
namespace Illuminate\Contracts\Auth;
interface UserProvider {
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
}
~~~
`retrieveById`?方法通常獲取一個代表用戶的鍵,例如 MySQL 數據中的自增ID。該方法獲取并返回匹配該ID的`Authenticatabl`?實現。
`retrieveByToken`?函數通過唯一標識和存儲在?`remember_token`?字段中的“記住我”令牌獲取用戶。和上一個方法一樣,該方法也返回?`Authenticatabl`?實現。
`updateRememberToken`?方法使用新的?`$token`?更新?`$user`?的?`remember_token`?字段,新令牌可以是新生成的令牌(在登錄是選擇“記住我”被成功賦值)或者null(用戶退出)。
`retrieveByCredentials`?方法在嘗試登錄系統時獲取傳遞給?`Auth::attempt`?方法的認證信息數組。該方法接下來去底層持久化存儲系統查詢與認證信息匹配的用戶,通常,該方法運行一個帶“where”條件(`$credentials[‘username’]`)的查詢。然后該方法返回?`UserInterface`?的實現。這個方法不做任何密碼校驗和認證。
`validateCredentials`?方法比較給定?`$user`和`$credentials`?來認證用戶。例如,這個方法比較?`$user->getAuthPassword()`?字符串和經?`Hash::make`?處理的?`$credentials['password']`。這個方法只驗證用戶認證信息并返回布爾值。
#### **Authenticatable 契約**
既然我們已經探索了?`UserProvider`?上的每一個方法,接下來讓我們看看?`Authenticatable`。該提供者應該從`retrieveById`?和?`retrieveByCredentials`?方法中返回接口實現:
~~~
<?php
namespace Illuminate\Contracts\Auth;
interface Authenticatable {
public function getAuthIdentifier();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
~~~
這個接口很簡單,`getAuthIdentifier`?方法返回用戶“主鍵”,在 MySQL 后臺中是ID,`getAuthPassword`?返回經哈希處理的用戶密碼,這個接口允許認證系統處理任何用戶類,不管是你使用的是 ORM 還是存儲抽象層。默認情況下,Laravel 自帶的?`app`?目錄下的?`User`?類實現了這個接口,所以你可以將這個類作為實現例子。
### **9、[事件](http://laravelacademy.org/tags/%e4%ba%8b%e4%bb%b6 "View all posts in 事件")**
Laravel 支持在認證過程中觸發多種事件,你可以在自己的?`EventServiceProvider`?中監聽這些事件:
~~~
/**
*?The?event?listener?mappings?for?the?application.
*
*?@var?array
*/
protected?$listen?=?[
'Illuminate\Auth\Events\Attempting'?=>?[
'App\Listeners\LogAuthenticationAttempt',
],
'Illuminate\Auth\Events\Login'?=>?[
'App\Listeners\LogSuccessfulLogin',
],
'Illuminate\Auth\Events\Logout'?=>?[
'App\Listeners\LogSuccessfulLogout',
],
];
~~~
- 序言
- 發行版本說明
- 升級指南
- 貢獻代碼
- 開始
- 安裝
- 配置
- Laravel Homestead
- 基礎
- HTTP 路由
- HTTP 中間件
- HTTP 控制器
- HTTP 請求
- HTTP 響應
- 視圖
- Blade 模板引擎
- 架構
- 一次請求的生命周期
- 應用目錄結構
- 服務提供者
- 服務容器
- 門面(Facades)
- 數據庫
- 起步
- 查詢構建器
- 遷移
- 填充數據
- Eloquent ORM
- 起步
- 關聯關系
- 集合
- 訪問器&修改器
- 序列化
- 服務
- 用戶認證
- 用戶授權
- Artisan Console
- 訂閱支付實現:Laravel Cashier
- 緩存
- 集合
- 集成前端資源:Laravel Elixir
- 加密
- 錯誤&日志
- 事件
- 文件系統/云存儲
- 哈希
- 輔助函數
- 本地化
- 郵件
- 包開發
- 分頁
- Redis
- 隊列
- Session
- Envoy Task Runner
- 任務調度
- 測試
- 驗證
- 新手入門指南
- 簡單任務管理系統
- 帶用戶功能的任務管理系統