Authentication trong Laravel 5.3
Bài đăng này đã không được cập nhật trong 7 năm
Xin chào các bạn. Hôm nay mình sẽ giới thiệu về Authentication trong Laravel 5.3 cho các bạn.
1.Giới thiệu
Laravel giúp cho việc thực hiện việc xác thực vô cùng đơn giản. Trong thực tế, hầu hết mọi thứ đã được cấu hình cho bạn mà bạn không thể tưởng tượng nổi. Các file cấu hình xác thực được đặt tại config/auth.php
, bao gồm một số hướng dẫn tùy biến rõ ràng cho việc tinh chỉnh cách xử lí của các dịch vụ Authentication.
Tại phần lõi của nó, các cơ sở của Laravel's authentication được tạo bởi các "guards" và "providers". Guards định nghĩa cái cách mà các user được xác thực cho mỗi request. Ví dụ, Laravel mang theo một session
guard cái mà duy trì trạng thái bằng cách sử dụng session storage và cookies và một token
guard, cái mà xác thực user bằng cách sử dụng một "API token" cái mà được truyền cùng mỗi request.
Providers định nghĩa cách mà user được truy xuất từ lưu trữ không đổi (persistent storage) của bạn. Laravel hỗ trợ cho việc truy xuất các user sử dụng Eloquent và Query Builder.
Đừng lo lắng nếu tất các điều này nghe có vẻ khó hiểu. Hầu hết các ứng dụng sẽ không cần tùy biến các cấu hình xác thực mặc định.
Database Considerations
Mặc định, Laravel bao gồm một Eloquent model App\User
trong thư mục app
. Model này có thể sử dụng với Eloquent authentication driver mặc định.
Khi xây dựng database schema cho model App\User
, đảm bảo rằng độ dài cột password tối thiểu là 60 kí tự, mặc định với 255 kí tự sẽ là 1 lựa chọn tốt.
Bạn cũng nên xác nhận table user
( hoặc một table khác tương đương ) gồm một giá trị nullable, cột remember_token
100 kí tự. Cột này sẽ được dùng để lưu một token cho session "remember me" khi đang được duy trì bởi ứng dụng của bạn.
2.Bắt đầu nhanh với Authentication
Laravel mang tới 2 authentication controllers tuyệt vời, được đặt trong namespace App\Http\Controllers\Auth
.AuthController
xử lí user đăng kí mới và xác nhận họ, trong khi PasswordController
bao gồm logic giúp cho các user đã tồn tại reset password. Mỗi controllers sử dụng một trait để bao gồm các phương thức cần thiết của chúng. Với nhiều ứng dụng, bạn sẽ không cần phải sửa đổi toàn bộ các controller.
Routing Laravel cung cấp một cách nhanh chóng để sinh ra toàn bộ các route và view cần thiết cho authentication chỉ với 1 command:
php artisan make:auth
Command này nên được dùng trên các ứng dụng mới và sẽ cài đặt các view đăng kí và đăng nhập cũng như các route cho toàn bộ việc xác thực đầu cuối. Một HomeController
cũng sẽ được sinh ra, phục vụ các request post-login tới ứng dụng. Tuy nhiên, bạn có thể tự do tùy chỉnh hoặc xóa controller này dựa trên sự cần thiết trong ứng dụng của bạn.
Views
Như đã đề cập ở phần trên, command php artisan make:auth
cũng sẽ tạo toàn bộ các view cần thiết cho việc xác thực và đặt chúng trong thư mục resources/views/auth
.
Command make:auth
cũng tạo một thư mục resources/views/layouts
bao gồm các layout cơ bản cho ứng dụng. Toàn bộ những view này sử dụng framework Bootstrap, nhưng bạn tự do tùy chỉnh nếu bạn thích.
Authenticating Bây giờ bạn có các route và view chuẩn bị cho các authentication controllers, bạn đã sẵn sàng để đăng kí và xác nhận những user mới cho ứng dụng. Bạn chỉ đơn giản truy cập ứng dụng thông qua trình duyệt. Các authentication controller đã sẵn sàng gồm các logic (thông qua trait của chúng) để xác nhận những user đã tồn tại và lưu những user mới vào database.
Tùy chỉnh đường dẫn
Khi một user được xác nhận thành công, họ sẽ được chuyển sang URI '/'. Bạn có thể tùy biến địa chỉ chuyển hướng post-authentication bằng cách định nghĩa thuộc tính redirectTo
trong AuthController
:
protected $redirectTo = '/home';
Khi một user không được xác nhận thành công, họ sẽ tự động chuyển hướng quay lại form đăng nhập.
Tùy chỉnh Guard
Bạn cũng có thể tùy biến "guard" cái mà sử dụng để xác thực user. Để bắt đầu, định nghĩa một thuộc tính guard
trong AuthController
. Giá trị của thuộc tính này nên tương ứng với một trong những guard đã được cấu hình trong file auth.php
.
protected $guard = 'admin';
Tùy biến Validation / Storage
Để thay đổi các trường trong form được yêu cầu khi người dùng đăng kí với ứng dụng của bạn, hoặc tùy biến các bản ghi user mới được chèn vào database như thế nào, bạn có thể chỉnh sửa class AuthController
. Class này chịu trách nhiệm việc validate và tạo user mới của ứng dụng.
Phương thức validator
của AuthController
bao gồm các luật validate cho user mới của ứng dụng. Bạn hoàn toàn tự do tùy chỉnh các phương thức này nếu bạn muốn.
Phương thức create
của AuthController
chịu trách nhiệm cho việc tạo bản ghi mới App\User
trong database sử dụng Eloquent ORM. Bạn tự do chỉnh sửa những phương thức này cho phù hợp database.
Truy xuất người dùng đã được xác thực
Bạn có thể truy cập người dùng đã được xác thực thông qua facade Auth
:
$user = Auth::user();
Ngoài ra, mội khi user đã được xác thực, bạn có thể truy cập thông qua môt instance Illuminate\Http\Request
. Hãy nhớ, các class gợi ý sẵn sẽ tự động được thêm vào trong các phương thức của controller:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
/**
* Update the user's profile.
*
* @param Request $request
* @return Response
*/
public function updateProfile(Request $request)
{
if ($request->user()) {
// $request->user() returns an instance of the authenticated user...
}
}
}
Kiểm tra việc xác thực của User
Để xác định user đã đăng nhập vào ứng dụng của bạn hay chưa, bạn có thể sử dụng phương thức check
trên face Auth
, sẽ trả về true nếu user đã được xác thực:
if (Auth::check()) {
// The user is logged in...
}
Tuy nhiên, bạn có thể sử dụng middleware để kiểm tra user đã được xác thực trước khi cho phép user truy cập vào các route / controller nhất định. Để tìm hiểu nhiều hơn về việc này, hãy xem qua tài liệu tại protecting routes.
Bảo vệ Route
Route middleware có thể được sử dụng để cho phép chỉ những user đã được xác thực truy cập vào các route đã cho. Laravel mang tới middleware auth
, cái mà được định nghĩa trong app\Http\Middleware\Authenticate.php
. Toàn bộ những gì bạn cần là đính kèm middleware vào định nghĩa (khai báo) của route.
// Using A Route Closure...
Route::get('profile', ['middleware' => 'auth', function() {
// Only authenticated users may enter...
}]);
// Using A Controller...
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'ProfileController@show'
]);
Tất nhiên, nếu bạn đang sử dụng controller classes, bạn có thể gọi phương thức middleware
từ contructor của controller thay vì đính kèm nó trong khai báo trực tiếp trong route:
public function __construct()
{
$this->middleware('auth');
}
Chỉ định một Guard
Khi đính kèm middleware auth
vào một route, bạn cũng có thể chỉ định guard nào sẽ được dùng để thực thi việc xác thực:
Route::get('profile', [
'middleware' => 'auth:api',
'uses' => 'ProfileController@show'
]);
Guard được chỉ định nên tương ứng với một trong các key trong mang guards
của file cấu hình auth.php
.
Authentication Throttling
Nếu bạn đang sử dụng lớp AuthController
được tích hợp trong Laravel, Illuminate\Foundation'Auth\ThrottlesLogins
trait có thể được dùng để điều chỉnh các nỗ lực đăng nhập vào ứng dụng của bạn. Mặc định, người dùng sẽ không thể đăng nhập trong 1 phút nếu họ thất bại trong việc cung cấp thông tin chính xác một vài lần. Việc điều phối này là duy nhất với một username / e-mail và địa chỉ IP của họ:
<?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;
// Rest of AuthController class...
}
3.Xác thực người dùng thủ công
Tất nhiên, bạn không bắt buộc phải sử dụng các authentication controller trong Laravel. Nếu bạn lựa chọn xóa những controller này, bạn sẽ cần phải quản lí việc xác thực user bằng cách sử dụng các class Laravel xác thực trực tiếp. Đừng lo lắng, nó là chắc chắn rồi!
Chúng ta sẽ truy cập vào các Laravel's authentication services thông qua facade Auth
, vì vậy chúng ta cần đảm bảo import facade Auth
tại đầu class. Tiếp theo, hãy kiểm tra phương thức attempt
:
<?php
namespace App\Http\Controllers;
use Auth;
class AuthController extends Controller
{
/**
* Handle an authentication attempt.
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// Authentication passed...
return redirect()->intended('dashboard');
}
}
}
Phương thức attempt
chấp nhận một mảng các cặp key / value như là tham số đầu tiên. Các giá trị trong mảng sẽ được dùng để tìm user trong database. Vì vậy trong ví dụ trên, user sẽ được lấy ra bởi giá trị của cột email
. Nếu tìm thấy user, hashed password được lưu trong database sẽ được dùng để so sánh với giá trị hashed password mà được truyền vào phương thức thông qua mảng. Nếu 2 hashed passowrd trùng hợp, một session sẽ được bắt đầu cho user.
Phương thức attemp
sẽ trả về true
nếu xác thực thành công. Ngược lại là false
.
Phương thức intended
trên redirector sẽ chuyển hướng user tới URL họ vừa cố gắn truy cập trước khi bị bắt bởi authentication filter. Một fallback URI có thể được cho trước vào phương thức này trong trường hợp đích đến dự kiến không có.
Specifying Additional Conditions Nếu muốn, bạn cũng có thể thêm những điều kiện mở rộng vào truy vấn xác thực. Ví dụ, chúng ta có thể xác nhận xem user đã được đánh dấu như "active":
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// The user is active, not suspended, and exists.
}
Accessing Specific Guard Instances
Bạn có thể chỉ định các guard instance bạn thích để làm việc bằng cách dùng phương thức guard
trên facade Auth
. Điều này cho phép bạn quản lí việc xác thực cho những thành phần khác nhau trong ứng dụng bằng cách sử dụng trọn vẹn các model có khả năng xác thực tách biệt hoặc các table user.
Tên của guard truyền vào phương thức guard
nên tương ứng với một trong các guard được cấu hình trong file auth.php
:
if (Auth::guard('admin')->attempt($credentials)) {
//
}
Đăng xuất
Để đăng xuất người dùng khỏi ứng dụng của bạn, bạn có thể sử dụng phương thức logout
trên facade Auth
. Việc này sẽ xóa toàn bộ thông tin xác thực trong session của user:
Auth::logout();
Ghi nhớ người dùng
Nếu bạn muốn cung cấp chức năng "remember me" trong ứng dụng, bạn có thể truyền một giá trị boolean như tham số thứ 2 vào phương thức attempt
, cái mà sẽ giữ cho người dùng đã được xác thực vô thời hạn, hoặc tới khi họ đăng xuất thủ công. Tất nhiên, table users
phải có một cột string remember_token
, cái mà sẽ được dùng để lưu token "remember me".
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// The user is being remembered...
}
Nếu bạn "remembering" người dùng, bạn có thể dùng phương thức viaRemember
để xác định nếu user đã được xác thực bằng cách dùng cookie "remember me":
if (Auth::viaRemember()) {
//
}
Dưới đây tôi đã giới thiệu các bước thực hiện một ví dụ cơ bản về Authentication trong Laravel 5.3.Cảm ơn các bạn đã theo dõi. Nếu có bất kì thắc mắc gì hãy để lại comment ở phía dưới nhé.
Tham Khảo https://laravel.com/docs/5.3
All rights reserved