Authentication trong Laravel

0

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,
ResetPasswordController
. Hàm này sẽ trả về một thể hiển guard.

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();
Leave A Reply

Your email address will not be published.