Laravel 讓實現(xiàn)認證機制變得非常簡單。事實上,幾乎所有的設置默認就已經完成了。有關認證的配置文件都放在 config/auth.php
里,而在這些文件里也都包含了良好的注釋描述每一個選項的所對應的認證服務。
Laravel 默認在 app
文件夾內就包含了一個使用默認 Eloquent 認證驅動的 App\User
模型。
注意:當為這個認證模型設計數據庫結構時,密碼字段至少有60個字符寬度。同樣,在開始之前,請先確認您的 users
(或其他同義) 數據庫表包含一個名為 remember_token
長度為 100 的string
類型、可接受 null 的字段。這個字段將會被用來儲存「記住我」的 session token。也可以通過在遷移文件中使用 $table->rememberToken();
方法。 當然, Laravel 5 自帶的 migrations 里已經設定了這些字段。
假如您的應用程序并不是使用 Eloquent ,您也可以使用 Laravel 的查詢構造器做 database
認證驅動。
Laravel 已經預設了兩個認證相關的控制器。 AuthController
處理新的用戶注冊和「登陸」,而 PasswordController
可以幫助已經注冊的用戶重置密碼。
每個控制器使用 trait 引入需要的方法。在大多數應用上,你不需要修改這些控制器。這些控制器用到的視圖放在 resources/views/auth
目錄下。你可以依照需求修改這些視圖。
要修改應用注冊新用戶時所用到的表單字段,可以修改 App\Services\Registrar
類。這個類負責驗證和建立應用的新用戶。
Registrar
的 validator
方法包含新用戶時的驗證規(guī)則,而 Registrar
的 create
方法負責在數據庫中建立一條新的 User
記錄。你可以自由的修改這些方法。Registrar
方法是通過AuthenticatesAndRegistersUsers
trait 的中的 AuthController
調用的。
如果你不想使用預設的 AuthController
,你需要直接使用 Laravel 的身份驗證類來管理用戶認證。別擔心,這也很簡單的!首先,讓我們看看 attempt
方法:
<?php namespace App\Http\Controllers;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'); } }}
attempt
方法可以接受由鍵值對組成的數組作為第一個參數。password
的值會先進行 哈希。數組中的其他 值會被用來查詢數據表里的用戶。所以,在上面的示例中,會根據 email
列的值找出用戶。如果找到該用戶,會比對數據庫中存儲的哈希過的密碼以及數組中的哈希過后的 password
值。假設兩個哈希后的密碼相同,會重新為用戶啟動認證通過的
session。
如果認證成功, attempt
將會返回 true
。否則則返回 false
。
**注意:**在上面的示例中,并不一定要使用
intended
方法會重定向到用戶嘗試要訪問的 URL , 其值會在進行認證過濾前被存起來。也可以給這個方法傳入一個預設的 URI,防止重定向的網址無法使用。
在認證過程中,你可能會想要加入額外的認證條件:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])){ // The user is active, not suspended, and exists.}
判斷一個用戶是否已經登錄,你可以使用 check
方法:
if (Auth::check()){ // The user is logged in...}
假如你想要在應用中提供「記住我」的功能,你可以傳入布爾值作為 attempt
方法的第二個參數,這樣就可以保留用戶的認證身份(或直到他手動登出為止)。當然,你的 users
數據表必需包括一個字符串類型的 remember_token
列來儲存「記住我」的標識。
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)){ // The user is being remembered...}
假如有使用「記住我」功能,可以使用 viaRemember
方法判定用戶是否擁有「記住我」的 cookie 來判定用戶認證:
if (Auth::viaRemember()){ //}
要通過 ID 來認證用戶,使用 loginUsingId
方法:
Auth::loginUsingId(1);
validate
方法可以讓你驗證用戶憑證信息而不用真的登陸應用:
if (Auth::validate($credentials)){ //}
你也可以使用 once
方法來讓用戶在單一請求內登陸。不會有任何 session 或 cookie 產生:
if (Auth::once($credentials)){ //}
假如你需要將一個已經存在的用戶實例登陸應用,你可以調用 login
方法并且傳入用戶實例:
Auth::login($user);
這個方式和使用 attempt
方法驗證用戶憑證信息是一樣的。
Auth::logout();
當然,假設你使用 Laravel 內建的認證控制器,預設提供了讓用戶登出的方法。
當 attempt
方法被調用時,auth.attempt
事件 會被觸發(fā)。假設用戶嘗試認證成功并且登陸了,auth.login
事件會被觸發(fā)。
當用戶通過認證后,有幾種方式取得用戶實例。
首先, 你可以從 Auth
facade 取得用戶:
<?php namespace App\Http\Controllers;use Auth;use Illuminate\Routing\Controller;class ProfileController extends Controller { /** * Update the user's profile. * * @return Response */ public function updateProfile() { if (Auth::user()) { // Auth::user() returns an instance of the authenticated user... } }}
第二種,你可以使用 Illuminate\Http\Request
實例取得認證過的用戶:
<?php namespace App\Http\Controllers;use Illuminate\Http\Request;use Illuminate\Routing\Controller;class ProfileController extends Controller { /** * Update the user's profile. * * @return Response */ public function updateProfile(Request $request) { if ($request->user()) { // $request->user() returns an instance of the authenticated user... } }}
第三,你可以使用 Illuminate\Contracts\Auth\Authenticatable
contract 類型提示。這個類型提示可以用在控制器的構造方法,控制器的其他方法,或是其他可以通過服務容器 解析的類的構造方法:
<?php namespace App\Http\Controllers;use Illuminate\Routing\Controller;use Illuminate\Contracts\Auth\Authenticatable;class ProfileController extends Controller { /** * Update the user's profile. * * @return Response */ public function updateProfile(Authenticatable $user) { // $user is an instance of the authenticated user... }}
路由中間件 只允許通過認證的用戶訪問指定的路由。Laravel 默認提供了 auth
中間件,放在 app\Http\Middleware\Authenticate.php
。 你需要做的只是將其加到一個路由定義中:
// With A Route Closure...Route::get('profile', ['middleware' => 'auth', function(){ // Only authenticated users may enter...}]);// With A Controller...Route::get('profile', ['middleware' => 'auth', 'uses' => 'ProfileController@show']);
HTTP 基本認證提供了一個快速的方式來認證用戶而不用特定設置一個「登入」頁。在您的路由內設定 auth.basic
中間件則可啟動這個功能:
Route::get('profile', ['middleware' => 'auth.basic', function(){ // Only authenticated users may enter...}]);
默認情況下 basic
中間件會使用用戶的 email
列當做「 username 」。
你可能想要使用 HTTP 基本認證,但不會在 session 里設置用戶身份的 cookie,這在 API 認證時特別有用。如果要這樣做,定義一個中間件并調用 onceBasic
方法:
public function handle($request, Closure $next){ return Auth::onceBasic() ?: $next($request);}
如果你使用 PHP FastCGI,HTTP 基本認證可能無法正常運行。請在你的 .htaccess
文件內新增以下代碼:
RewriteCond %{HTTP:Authorization} ^(.+)$ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
大多數的 web 應用程序都會提供用戶忘記密碼的功能。為了不讓開發(fā)者重復實現(xiàn)這個功能,Laravel 提供了方便的方法來發(fā)送忘記密碼通知及密碼重設的功能。
在開始之前,請先確認您的 User
模型實現(xiàn)了 Illuminate\Contracts\Auth\CanResetPassword
接口。當然,默認 Laravel 的 User
模型本身就已實現(xiàn),并且引入Illuminate\Auth\Passwords\CanResetPassword
來包括所有需要實現(xiàn)的接口方法。
接下來,我們需要生成一個數據庫表來儲存重設密碼標志。Laravel 默認已經包含了這個遷移表,放在 database/migrations
的目錄下。你所需要作的只有執(zhí)行遷移:
php artisan migrate
Laravel 還包含了 Auth\PasswordController
其中包含重設用戶密碼的功能。甚至一些視圖,可以讓你直接開始使用!視圖放在 resources/views/auth
目錄下。你可以按照你的應用程序設計,自由的修改這些視圖。
你的使用者會收到一封 e-mail,內含連接指向 PasswordController
中的 getReset
方法。這個方法會顯示密碼重設表單,允許用戶重新設定密碼。在密碼重新設定完之后,用戶將會自動登錄到應用中,然后被重定向到 /home
。你可以通過 PasswordController
中的 redirectTo
來定義重設密碼后要重定向的位置:
protected $redirectTo = '/dashboard';
**注意:**默認情況下,密碼重設 tokens 會在一小時后過期。你可以修改
config/auth.php
文件中的reminder.expire
更改 這個設定。
除了傳統(tǒng)的以表單進行的認證,Laravel 還提供了簡單、易用的方式,使用 Laravel Socialite 進行 OAuth 認證。Socialite 目前支持的認證有 Facebook、 Twitter、Google、以及GitHub 和 Bitbucket 。
如果要開始使用第三方認證,請將下面的代碼加入到你的 composer.json
文件內:
"laravel/socialite": "~2.0"
接下來,在你的 config/app.php
配置文件中注冊 Laravel\Socialite\SocialiteServiceProvider
。也可以注冊 facade:
'Socialize' => 'Laravel\Socialite\Facades\Socialite',
你需要在應用程序中加入 OAuth 服務所需的憑證。這些憑證都放在 config/services.php
配置文件里,并根據應用的需求使用 facebook
、twitter
、google
或 github
作為對應的鍵值。例如:
'github' => [ 'client_id' => 'your-github-app-id', 'client_secret' => 'your-github-app-secret', 'redirect' => 'http://your-callback-url',],
接下來就準備認證用戶了!你會需要兩個路由:一個用于將用戶重定向至認證提供網站,另一個用于認證之后,從認證服務接收回調。下面是一個使用 Socialize
facade 的示例:
public function redirectToProvider(){ return Socialize::with('github')->redirect();}public function handleProviderCallback(){ $user = Socialize::with('github')->user(); // $user->token;}
redirect
方法將用戶重定向到認證 OAuth 的網站,而 user
方法會獲取返回的請求,以及從認證網站取得的用戶信息。在重定向至用戶之前,你也可以設定請求的「 scopes 」:
return Socialize::with('github')->scopes(['scope1', 'scope2'])->redirect();
一旦你取得用戶實例,你能獲取到更多的用戶詳細信息:
$user = Socialize::with('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();
更多建議: