Authentication trong Laravel
Trong các hệ thống website đang hoạt động trên Internet, một tính năng không thể thiếu là xác thực người dùng. Tính năng này giúp các website biết được ai đang sử dụng hệ thống để điều hướng thành viên đến các nguồn tài nguyên khác nhau, ngoài ra nó bảo mật thông tin khác nhau với các nhóm thành viên khác nhau. Trước đây, để viết một tính năng xác thực người dùng là mất rất nhiều công sức, nhưng Laravel đã làm mọi việc trở nên thật đơn giản.
Thực hiện authentication tức phải tương tác với bảng users. Do đó Laravel đã tạo sẵn model User trong file app\user.php cho bạn. Nếu bạn không dùng Eloquent thì có thể sử dụng query builder thay thế.
Cài đặt
Để triển khai authentication trong Laravel, bạn cài đặt gói laravel/ui vào project bằng cách mở Terminal chạy lần lượt từng lệnh sau:
composer require laravel/ui
npm install
npm run dev
Sau đó chạy lệnh
php artisan ui vue –auth
Lệnh này sẽ :
- Tạo các view trong folder views\auth : login.blade.php, register.blade.php …


- Tạo file views\layouts\app.blade.php – là 1 file layout cơ bản với các class css dựa trên bootstrap nhưng bạn có thể sửa lại.
- Tạo các đường route xử lý authentication trong file route/web.php
- Tạo các controller trong folder Http\Controllers\Auth như
- RegisterController: Quản lý việc đăng ký thành viên mới.
- LoginController: Quản lý việc đăng nhập các thành viên.
- ForgotPasswordController: gửi email với đường link sử dụng cho reset password.
- ResetPasswordController: kiểm soát việc reset mật khẩu với các logic do lập trình viên thêm vào

.
sau đó bạn chạy lệnh
php artisan migrate // Dùng để migrate 2 bảng users và password_resets có sẵn trong project khi mới init
Khi thực hiện xong thì hệ thống sẽ sinh ra cho chúng ta những thứ sau. Thứ nhất các bạn vào routes/web.php
sẽ thấy những dòng code này sinh ra
Auth::routes(); Route::get('/home', 'HomeController@index')->name('home');
Vậy chúng ta cũng có thể hiểu, hệ thống sẽ sinh ra những route để phục vụ cho việc login, logout, register, forgot password. Các bạn cũng có thể sử dụng câu lệnh php artisan route:list
để xem được các thông tin như sau :
+--------+---------------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+---------------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|POST|HEAD | broadcasting/auth | | Illuminate\Broadcasting\BroadcastController@authenticate | web | | | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth | | | GET|HEAD | home/loginUser | | App\Http\Controllers\HomeController@index | web,auth | | | GET|HEAD | home/logoutUser | | App\Http\Controllers\HomeController@onLogout | web,auth | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest | | | POST | password/reset | | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | +--------+---------------+------------------------+------------------+------------------------------------------------------------------------+--------------+
Tùy biến Path trong controller
Ở trong LoginController, RegisterController, ResetPasswordController
các bạn có thấy biến $redirect
không, biến này giúp chúng ta điều chỉnh lại cái đường dẫn mà khi ta Xong việc login, register, reset password sẽ redirect tới đường dẫn mà ta tùy chỉnh.
protected $redirectTo = '/home';
Khi 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. Tiếp theo bạn cũng có thể điều chỉnh trong middeware RedirectIfAuthenticated
public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::HOME); } return $next($request); }
Tùy biến Username, Guard
Theo mặc định của Laravel thì sẽ đăng nhập bằng email
. Nếu muốn tùy chỉnh thì chúng ta cũng có thể vào LoginController
để định nghĩa method username
public function username() { return 'username'; }
Chúng ta cũng có thể tùy biến guard
– sử dụng để xác thực user. Để bắt đầu, định nghĩa một phương thức guard
trong LoginController, RegisterController,
. Hàm này sẽ trả về một thể hiển guard.
ResetPasswordController
use Illuminate\Support\Facades\Auth; protected function guard() { return Auth::guard('guard-name'); }
GET thông tin của user đã đăng nhập
The Authenticatable Contract
Bây giờ chúng ta đã khám phá từng phương thức trong UserProvider
, hãy xem qua Authenticatable
contract. Nhớ rằng, provider nên trả về các implementations của interface này từ phương thức retrieveById
và retrieveByCredentials
:
<?php namespace Illuminate\Contracts\Auth; interface Authenticatable { public function getAuthIdentifierName(); public function getAuthIdentifier(); public function getAuthPassword(); public function getRememberToken(); public function setRememberToken($value); public function getRememberTokenName(); }
Interface này là đơn giản. Phương thức getAuthIdentifierName
trả về tên của trường “primary key” của user và getAuthIdentifier
trả về “primary key” của user. Trong MySQL back-end sẽ là auto-incrementing primary key. getAuthPassword
trả về password đã được hashed. Interface này cho phép hệ thống xác thực làm việc với bất kì lớp User nào, bất kể ORM nào hay các lớp lưu trữ trừu tượng (storage abstraction layer) nào bạn đang sử dụng. Mặc định, Laravel bao gồm một class User
trong thư mục app
cái mà implement interface này, vì vậy bạn có thể tham khảo class này như một ví dụ.
Events
Laravel xây dựng một loạt events khác nhau trong khi xử lí xác thực. Bạn có thể đính kèm các listener vào những event này trong EventServiceProvider
của bạn:
/** * 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', ], 'Illuminate\Auth\Events\Lockout' => [ 'App\Listeners\LogLockout', ], ];
Đăng Xuất
Auth::logout();