Authentication trong Laravel 5.3

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' => '[email protected]'
]);

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' => '[email protected]'
]);

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