Tạo Authentication cho module Backend và Frontend trong Laravel 5

Sharing is caring!

Cũng lâu lắm rồi mới có thời gian viết bài mới. Hôm nay, tui sẽ trình bày cách để tạo authentication cho từng module Frontend và Backend. Ở đây tui sẽ mặc định là chúng ta đã tạo 2 module là Frontend và Backend nhé (các bạn có thể xem tại đây).

1. Cấu trúc thư mục:

Giả sử tui có một project tên rubik có các thư mục module BackendFrontend như sau:

2. Database để login:

Để login, giả sử tui có 2 table là usercustomer ở dưới database tương ứng để login ở BackendFrontend như sau:

Database script để tạo 2 table này:

Mỗi table có sẵn 1 account để tí nữa test login

  • alibaba@gmail.com/112233 (user)
  • aladin@gmail.com/123123 (customer)

Các bạn cần tạo model tương ứng cho 2 table trên. Tại thư mục framework/app, các bạn tạo một thư mục tên là Models, trong thư mục Models này, các bạn tạo 2 file model lần lượt là User.phpCustomer.php

Thêm namespace App\Models và file composer.json ở phần psr-4

Bậy giờ các bạn viết phần nội dung cho 2 file User.phpCustomer.php. Có 2 cách:

Một là các bạn extends cái class Illuminate\Foundation\Auth\User có sẵn của nó (xem cái file app/User.php có sẵn thì nó làm theo cách này). Hai là các bạn tự viết lại. Ở đây tui sẽ dùng 2 cách cho 2 file Models/User.phpModels/Customer.php

Models/User.php:

Models/Customer.php:

Kết nối database:

Các bạn mở file framework/.env, edit các biến sau:

Tùy theo username, password của mysql của các bạn là gì thì ghi vô cho đúng nha.

Nếu các bạn có dùng prefix khi tạo table giống tui, thì các bạn mở file config/database.php, tìm cái phần mysql trong mục connections, edit lại phần prefix:

3. Tạo Authentication Provider và Guard:

Trong Laravel 5.4, cơ chế login là dựa trên provider. Mỗi provider sẽ tương ứng với một Model. Ở đây ta có 2 Model là User và Customer dùng để login ở Backend và Frontend, vậy ta cần có 2 provider.

Để sử dụng Provider này trong Controller, Middleware hoặc View, ta cần tạo Guard. Mỗi Guard sẽ ứng với một Provider, 2 Guard khác nhau có thể dùng cùng 1 Provider.

Các bạn mở file framework/config/auth.php

Tìm mục providers, bạn sẽ thấy nó có 1 sẵn cái provider là users, kệ nó, mình thêm vào 2 cái của mình là admincustomer (đặt tên là gì cũng được, đây là key của array):

Có Provider rồi, các bạn tìm cái phần guards (cũng trong file framework/config/auth.php), nó có sẵn 2 cái guard là web và api, cũng kệ nó luôn, tạo 2 cái guard tên là admincustomer (đặt tên gì cũng được, không nhất thiết phải giống với Provider):

Các bạn chú ý là ở phần providers các bạn đặt tên là gì thì ở phần guards, trong cái phần provider thì các bạn ghi đúng cái tên đó nha.

4. Tạo trang login và AuthController:

Sau khi có Provider và Guard rồi, chúng ta làm trang login. Do phần login ở Backend và Frontend đều như nhau, chỉ khác nhau là dùng guard nào thôi, cho nên tui sẽ làm phần Backend, còn phần Frontend thì tương tự nhé

4.1. Tạo view cho trang login:

Tại thư mục Backend/Views, tạo thư mục admin.

Trong thư mục Backend/Views/admin, tạo file login.blade.php:

4.2. Tạo AuthController:

Tại thư mục Backend/Controllers, tạo file AuthController.php:

Chú ý hàm getLogin sẽ trả về giao diện là trang login

Để khi gõ url: http://localhost:8080/learning/rubik/admin/login, cái Route nó hiểu và gọi hàm getLogin của AuthController thì chúng ta phải edit lại cái file Backend/routes.php như sau:

Chú ý cái parameter của hàm group: ‘namespace’ => ‘App\Modules\Backend\Controllers’. Nếu không dùng cái parameter này thì ngay chổ phần gọi hàm của controller, các bạn phải viết đầy đủ namespace như vầy:

Giờ mà các bạn gõ url http://localhost:8080/learning/rubik/admin/login mà nó ra như sau là ok:

4.3. Xử lý phần validate email và password:

Thêm hàm postLogingetLogout vào file Backend/Controllers/AuthController.php:

Edit lại file Backend/routes.php, thêm 2 cái Route cho validate login và logout:

Giờ nếu các bạn click nút “Login” thì nó sẽ báo lỗi (1/1) TokenMismatchException, lý do là Laravel nó sẽ kiểm tra cái token mỗi khi bạn thực hiện một POST request để tránh trường hợp bị cái lỗi Flood Post.

Để thêm cái token, các bạn edit trang Backend/Views/login.blade.php như sau:

Test thôi,

Không ghi email, password gì cả, click “Login” mà nó báo lỗi là ok:

Nhập email: alibaba@gmail.com, password: 112233 mà nó vào được trang Hello Backend có cái link Logout là ok luôn.

Đó là phần login cho Backend, tương tự cho phần Frontend, các bạn gọi cái guard là customer thay cho cái guard admin. Nhớ là cái namespace của Frontend là App\Modules\Frontend\Controllers, chổ nào là Backend thì thay bằng Frontend.

Tại thư mục Frontend/Controllers, tạo file AuthController.php:

Tại thư mục Frontend/Views, tạo thư mục customer.

Trong thư mục Frontend/Views/customer, tạo file login.blade.php:

Edit lại file Frontend/routes.php, thêm 2 cái Route cho validate login và logout:

Nhập email: aladin@gmail.com, password: 123123 để test như phần Backend.

Tới đây, có một vấn đề là nếu bạn không login, thì bạn vẫn vào được trang Hello Backend. Đó là do chúng ta chưa validate được là user đã login hay chưa. Để làm việc này, chúng ta phải dùng Middleware.

5. Tạo Authentication Middleware:

Trong Laravel 5, middleware đóng vai trò là bộ lọc (filter) các request, các bạn tưởng tượng nó như các lớp của củ hành tây vậy. Các request phải “xuyên qua” hết các lớp này thì mới thực thi các callback function của Route hay Controller tương ứng. Do đó ta cũng áp dụng cơ chế này để validate xem user đã login chưa?

  • Nếu login rồi thì thôi, tiếp tục thực hiện.
  • Chưa login, cho về lại trang login

Chúng ta có thể dùng một Middleware cho 2 Module Backend và Frontend, nhưng như thế thì khó quản lý code lắm. Cho nên tui sẽ làm 2 cái Middleware tương ứng cho 2 module Backend và Frontend

5.1. Tạo Middleware cho Backend và Frontend:

Tại thư mục Modules/Backend/Middleware, tạo file AdminAuthentication.php:

Tại thư mục Modules/Frontend/Middleware, tạo file CustomerAuthentication.php:

các bạn chú ý cái namespace App\Modules\Backend\MiddlewareApp\Modules\Frontend\Middleware cũng như 2 cái guard là admincustomer nha.

Để Laravel nó chạy 2 cái Middleware này, các bạn mở file app\Http\Kernel.php, tìm cái biến array $routeMiddleware, thêm vào cuối array này 2 dòng như sau:

Cái hàm xử lý chính trong việc kiểm tra là đã login hay chưa là hàm:

nếu đã login thì thôi, tiếp tục. Còn nếu chưa login thì phần xử lý này nó nằm trong file app/Exceptions/Handler.php, hàm unauthenticated như sau:

Nếu để vậy nó không chạy đâu, các bạn sửa lại tí:

Đổi dòng

thành

Cuối cùng, để dùng 2 cái middleware admin_authcustomer_auth, thì các bạn có thể gọi hàm middleware của Route như sau:

Mở file Backend/routes.php:

thêm hàm middleware vào sau hàm get:

hoặc vào trước hàm get;

Test thôi! Logout nếu đang ở trang Hello Backend. Thử gõ url http://localhost:8080/learning/rubik/admin thì nó sẽ redirect về trang login. Làm tương tự cho file Frontend/routes.php và dùng middleware là customer_auth.

Ngoài ra, nếu cái Route của các bạn gọi hàm của Controller thì các bạn có thể gọi middleware trực tiếp trong Controller luôn và gọi ở hàm __construct(), không cần gọi hàm middleware của Route như trên nữa.

Ví dụ, tui có DashboardController trong Backend:

Trên đây là những gì tui biết về phần Authentication trong Laravel 5, tuy bài viết hơi dài, nhưng các phần đều có liên quan với nhau. Hi vọng là bài này sẽ giúp giải đáp phần nào thắc mắc của các bạn về phần Authentication.  THANK-YOU

Sharing is caring!

Tạo module Backend và Frontend trong Laravel 5
Redis Pub/Sub - Cơ chế hoạt động - Cài đặt trên Windows

Vincent Le

Tui là Lê Minh Đạt, tên tiếng anh là Vincent(do thích nhân vật Vincent Valentine, ai từng là fan của trò Final Fantasy VII thì sẽ biết nhân vật này, hehe). Đang tập tành làm một blogger viết về mảng lập trình, mong muốn được chia sẻ những gì đã học được, tích góp được trong 10 năm đi làm thợ code.

shares