Xây dựng website bán hàng bằng Laravel - Phân quyền truy cập
Sau khi cài đặt Laravel Breeze và thực hiện phân chia layout cho Khách hàng và Quản trị viên, công việc tiếp theo chúng ta cần làm là phân chia quyền hạn truy cập. Theo đó Admin (Quản trị viên) sẽ có quyền truy cập vào phần quản lý của hệ thống trong khi Khách hàng thì không được phép truy cập vào những trang này.
E-commerce với Laravel là loạt bài ghi lại toàn bộ quá trình xây dựng hệ thống thương mại điện tử được thực hiện bởi Transmoni team nhắm hướng dẫn mọi người làm quen với Laravel, Livewire, Alpine.js và Tailwind CSS. Hiện dự án đang được cập nhật liên tục, toàn bộ mã nguồn của dự án sẽ được công khai miễn phí theo hình thức mã nguồn mở trên trang Github của Transmoni sau khi hoàn tất loạt bài hướng dẫn này.
Điều chỉnh giao diện trang đăng nhập
Laravel Breeze cung cấp sẵn cho chúng ta các trang xác thực người dùng bao gồm đăng nhập, đăng ký, quên mật khẩu... Tuy nhiên sau khi phân chia lại layout các trang này hiển thị chưa được phù hợp lắm với layout mới của chúng ta, và công việc lúc này là điểu chỉnh lại một chút cho dễ nhìn hơn.
Trước hết, hãy truy cập vào trang /login
bạn sẽ thấy nội dung của trang này khá dài như hình dưới:
Để khắc phục hãy tìm đến app/resources/views/components/auth-card.blade.php
và xóa đi 2 css class là min-h-screen
và bg-gray-100
Lúc này nội dung file app/resources/views/components/auth-card.blade.php
sẽ có dạng như sau:
<div class="flex flex-col sm:justify-center items-center pt-6 sm:pt-0">
<div>
{{ $logo }}
</div>
<div class="w-full sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md overflow-hidden sm:rounded-lg">
{{ $slot }}
</div>
</div>
Và hãy cùng nhìn lại trang /login
của chúng ta sau khi đã điều chỉnh, dễ chịu hơn rất nhiều đúng không nào?
Bằng việc thay đổi css class cho component auth-card.blade.php
đồng nghĩa với việc giao diện của các trang đăng ký, quên mật khẩu hay xác thực email... sẽ đồng loạt thay đổi theo, bạn có thể truy cập vào /register
hoặc /forgot-password
để kiểm nghiệm.
Và đó là một trong những tính năng cực kỳ thuận tiện khi sử dụng component trong Laravel. Bạn có thể tìm hiểu thêm về blade component tại: https://laravel.com/docs/9.x/blade#components
Phân quyền truy cập
Với hầu hết các ứng dụng web app thì việc phân chia quyền hạn để truy cập hệ thống là tính năng không thể thiếu. Theo đó, các user là quản trị viên sẽ yêu cầu có các thuộc tính đặc biệt hơn user là khách hàng để có thể truy cập được các trang quản trị hoặc các trang nội bộ của ứng dụng.
Tại các hệ thống lớn lập trình viên có thể xây dựng một ứng dụng biệt lập với một tên miền riêng dành cho trang quản trị và hầu hết khách hàng không được biết đến. Tuy nhiên với các dự án vừa và nhỏ thì việc xây dựng các hệ thống riêng biệt thường ít được áp dụng vì chúng tiêu tốn rất nhiều chi phí và nhân lực để bảo trì hoặc bảo dưỡng. Và dự án này của chúng ta cũng không ngoại lệ, tại đây chúng ta sẽ thực hiện một cách cơ bản nhất có thể là tạo dựng trang quản trị ngay trên cùng một hệ thống với trang khách hàng.
Để bắt đầu, trước hết chúng ta cần thêm một function vào app/Models/User.php
để quy định các điều kiện của một Admin. Hãy bắt đầu một cách đơn giản như sau:
public function isAdmin(): bool
{
return in_array($this->email, [
'long@laramart.test',
]);
}
function này sẽ thực hiện kiểm tra email của người đang đăng nhập có nằm trong danh sách các email được quy định là Admin hay không và trả về giá trị boolean, nếu phù hợp là true và nếu không sẽ là false.
Tiếp đến chúng ta sẽ tạo một Middleware để xác thực người dùng đăng nhập có là Admin hay không. Tại cửa sổ terminal của mình bạn gõ lệnh php artisan make:middleware IsAdminMiddleware
để tiến hành khởi tạo một middleware mới. Sau đó tiến hành cập nhật nội dung cho function handle tại file app/Http/Middleware/IsAdminMiddleware.php
như sau:
public function handle(Request $request, Closure $next)
{
if (! $request->user()->isAdmin()) {
abort(403);
}
return $next($request);
}
Tiếp đến chúng ta cần khai báo middleware này vào app/Http/Kernel.php
tại phần $routeMiddleware
như sau:
protected $routeMiddleware = [
...
'isAdmin' => App\Http\Middleware\IsAdminMiddleware::class,
];
Vậy là chúng ta đã hoàn thành việc tạo một middleware giúp lọc các request đến từ User là Admin. Và bây giờ chúng ta sẽ tạo các route dành cho Admin tại app\routes\web.php
và tiến hành áp dụng middleware vừa hoàn thành như sau:
Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'isAdmin']], function () {
...
Route::view('/', 'dashboard');
...
});
Tại nhóm route này, chúng ta sẽ quy định tất cả uri có tiền tố là admin
sẽ phải vượt qua được Authenticate
middleware và IsAdmin
middleware nếu không sẽ trả về lỗi 403.
Kết luận
Vậy là chúng ta đã hoàn thành việc điều chỉnh lại giao diện cho các trang xác thực người dùng bằng cách thay đổi nội dụng của blade component cũng như hoàn tất việc phân quyền truy cập dành cho quản trị viên. Ở bài kế tiếp tôi sẽ hướng dẫn xây dựng tính năng tạo và quản lý danh mục sản phẩm.
Hẹn gặp lại các bạn!