Xây dựng website bán hàng bằng Laravel - Phân quyền truy cập

Ngày đăng
Tác giả
Tran Thanh Long

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:

Trang đăng nhập trước khi điều chỉnh

Để 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-screenbg-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?

Trang đăng nhập sau khi điều chỉnh

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!

Thông báo biến động số dư qua API & Webhook.

Hỗ trợ tích hợp giao dịch chuyển khoản vào hệ thống thanh toán trực tuyến Tự động, Nhanh chóng, Chính xác.

Đăng ký dùng thử trong 14 ngày
Bài viết mới nhất

Xây dựng website bán hàng bằng Laravel - Dựng trang thông tin Sản phẩm

Để Khách hàng có thể xem và tìm hiểu kỹ hơn về thông tin của một Sản phẩm bao gồm giá bán, số lượng tồn kho hay các mô tả về những đặc tính kỹ thuật ví dụ chất liệu, kiểu dáng... chúng ta sẽ cần đến một trang riêng cho mỗi sản phẩm, hãy cùng tìm hiểu cách để tạo một trang như vậy trong bài viết này.

Xây dựng website bán hàng bằng Laravel - Thiết lập và quản lý đơn hàng

Quản lý đơn hàng là quy trình back-end để quản lý và kiện toàn các đơn hàng trực tuyến. Việc này bao gồm mọi thứ từ định tuyến đơn hàng, in nhãn vận chuyển cho đến đến trả hàng cho khách. Trong bài viết của ngày hôm nay chúng ta sẽ cùng tìm hiểu cách để tạo và quản lý các đơn đặt hàng.