Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Trang Chủ Hướng Dẫn Đồ Án Tạo chức năng phân quyền user và admin bằng PHP
Hướng Dẫn Đồ ÁnLập Trình Web

Tạo chức năng phân quyền user và admin bằng PHP

Chia sẻ
Chia sẻ

Việc phân quyền người dùng là một phần không thể thiếu trong các ứng dụng web hiện đại. Phân biệt giữa user và admin giúp bảo vệ các chức năng quan trọng, kiểm soát truy cập và đảm bảo hệ thống vận hành đúng vai trò của từng người dùng. Mô hình phân quyền phổ biến nhất là Role-Based Access Control (RBAC), cho phép mỗi tài khoản được gán một vai trò cụ thể và xử lý logic dựa trên vai trò đó.

Nếu bạn chưa xây dựng hệ thống đăng nhập hoặc kết nối cơ sở dữ liệu, hãy tham khảo trước bài Hướng dẫn tạo form đăng nhập có validate trong PHP thuần và bài Kết nối MySQL bằng PDO trong PHP và xử lý lỗi kết nối. Đây là nền tảng cần thiết để triển khai phân quyền chính xác và an toàn.

Cơ chế phân quyền dựa trên vai trò

Role-Based Access Control là gì?

Role-Based Access Control (RBAC) là mô hình phân quyền mà mỗi người dùng được gán một vai trò cụ thể, ví dụ như admin, user, editor,… Mỗi vai trò sẽ có những quyền hạn riêng biệt và được hệ thống kiểm tra trước khi cho phép thực hiện các hành động.

Ví dụ: admin có thể truy cập trang quản lý người dùng, chỉnh sửa dữ liệu, trong khi user chỉ được xem thông tin cơ bản. Việc tách biệt quyền này giúp đảm bảo bảo mật và tránh các lỗi logic trong hệ thống.

Lợi ích khi áp dụng phân quyền từ sớm

Việc áp dụng phân quyền ngay từ đầu mang lại nhiều lợi ích:

  • Bảo mật: Giảm rủi ro người dùng truy cập trái phép vào dữ liệu nhạy cảm.

  • Mở rộng dễ dàng: Dễ bổ sung các vai trò mới mà không cần viết lại nhiều mã.

  • Tối ưu bảo trì: Hệ thống rõ ràng, dễ kiểm tra, dễ debug.

Thiết kế cơ sở dữ liệu cho phân quyền

Thêm cột role vào bảng users

Bước đầu tiên để phân quyền là cần có một trường thể hiện vai trò người dùng trong bảng users. Trường role có thể là kiểu VARCHAR, hoặc ENUM nếu bạn muốn giới hạn giá trị ở mức SQL.

Dưới đây là câu lệnh SQL tạo bảng users với phân quyền cơ bản:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role ENUM('user', 'admin') NOT NULL DEFAULT 'user'
);

Thêm dữ liệu mẫu để kiểm thử

Bạn nên tạo sẵn một số tài khoản mẫu cho vai trò useradmin. Mật khẩu nên được mã hóa bằng password_hash() trong PHP:

INSERT INTO users (username, password, role) VALUES
('admin1', '$2y$10$abcd...efgh', 'admin'),
('user1', '$2y$10$ijkl...mnop', 'user');

Tạo form đăng nhập và xử lý phân quyền

Form đăng nhập cơ bản

Form đăng nhập bao gồm hai trường: usernamepassword. Dữ liệu từ form sẽ được gửi đến file xử lý đăng nhập để kiểm tra tính hợp lệ và phân quyền dựa trên vai trò người dùng.

Dưới đây là ví dụ form đơn giản:

<!-- login.php -->
<form action="process_login.php" method="POST">
    <label>Tên đăng nhập:</label><br>
    <input type="text" name="username" required><br>
    <label>Mật khẩu:</label><br>
    <input type="password" name="password" required><br>
    <button type="submit">Đăng nhập</button>
</form>

Xử lý đăng nhập và lưu thông tin session

File process_login.php sẽ xác thực người dùng bằng cách truy vấn cơ sở dữ liệu, sau đó lưu thông tin usernamerole vào $_SESSION nếu đúng.

<?php
session_start();
require_once 'db.php';

$username = trim($_POST['username']);
$password = trim($_POST['password']);

$pdo = getPDO();
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();

if ($user && password_verify($password, $user['password'])) {
    $_SESSION['username'] = $user['username'];
    $_SESSION['role'] = $user['role'];
    header('Location: dashboard.php');
} else {
    echo "Đăng nhập không hợp lệ!";
}

Tạo dashboard phân biệt quyền

Phân hướng người dùng theo vai trò

Sau khi đăng nhập, tùy thuộc vào vai trò mà người dùng sẽ được chuyển đến trang riêng biệt: admin hoặc user.

// dashboard.php
session_start();

if (!isset($_SESSION['role'])) {
    header('Location: login.php');
    exit();
}

if ($_SESSION['role'] === 'admin') {
    header('Location: admin_panel.php');
} elseif ($_SESSION['role'] === 'user') {
    header('Location: user_home.php');
} else {
    echo "Vai trò không hợp lệ.";
}

Bảo vệ trang riêng theo vai trò

Kiểm tra quyền trước khi truy cập

Trang admin chỉ nên được phép truy cập bởi người có role = admin. Bạn nên thực hiện kiểm tra ở mỗi trang riêng biệt hoặc xây dựng một file auth.php dùng chung.

// admin_panel.php
session_start();

if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
    echo "Bạn không có quyền truy cập trang này.";
    exit();
}

echo "<h2>Chào Admin: {$_SESSION['username']}</h2>";

Trang dành cho user

Người dùng thông thường cũng có giao diện riêng. Bạn nên tạo trang user_home.php cho họ:

// user_home.php
session_start();

if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'user') {
    echo "Bạn không có quyền truy cập.";
    exit();
}

echo "<h2>Chào mừng người dùng: {$_SESSION['username']}</h2>";

Tạo menu điều hướng theo role

Cá nhân hóa menu theo vai trò người dùng

Menu điều hướng sẽ hiển thị các mục khác nhau tùy thuộc vào quyền của người dùng. Việc này giúp giao diện trực quan và bảo mật hơn.

// menu.php
<?php
session_start();

if ($_SESSION['role'] === 'admin') {
    echo "<a href='admin_panel.php'>Trang quản trị</a> | ";
}
if ($_SESSION['role'] === 'user') {
    echo "<a href='user_home.php'>Trang người dùng</a> | ";
}
echo "<a href='logout.php'>Đăng xuất</a>";
?>

Tối ưu phân quyền bằng middleware (auth.php)

Tái sử dụng kiểm tra quyền

Để tránh lặp lại logic kiểm tra quyền, bạn có thể tạo một hàm dùng chung:

// auth.php
function requireRole($role) {
    session_start();
    if (!isset($_SESSION['role']) || $_SESSION['role'] !== $role) {
        echo "Truy cập bị từ chối.";
        exit();
    }
}

Áp dụng vào các trang

// admin_panel.php
require_once 'auth.php';
requireRole('admin');

echo "<h2>Quản trị admin</h2>";

Đăng xuất và hủy session

Giải phóng phiên đăng nhập

Đăng xuất là bước cuối cùng để bảo vệ tài khoản và kết thúc phiên đăng nhập. Bạn có thể dùng session_destroy():

// logout.php
session_start();
session_unset();
session_destroy();
header('Location: login.php');

Mở rộng hệ thống với nhiều vai trò

Hỗ trợ nhiều role hơn

Hệ thống hiện tại chỉ phân biệt adminuser, nhưng bạn hoàn toàn có thể mở rộng thêm editor, manager, moderator… bằng cách thêm role vào ENUM và cập nhật logic kiểm tra phù hợp.

Quản lý role bằng bảng riêng

Nếu hệ thống phức tạp hơn, bạn có thể tách roles thành bảng riêng và liên kết với user bằng role_id, giúp dễ thay đổi quyền mà không sửa mã nguồn.

Kết luận

Phân quyền trong ứng dụng web không chỉ là tính năng – nó là hàng rào bảo mật quan trọng. Bằng cách áp dụng mô hình phân quyền theo vai trò, bạn có thể xây dựng một hệ thống rõ ràng, an toàn và dễ mở rộng. Việc tổ chức mã kiểm tra quyền một cách hợp lý sẽ giúp giảm lỗi, tăng khả năng tái sử dụng và bảo trì.

Hy vọng qua bài viết này, bạn có thể tự tin triển khai chức năng phân quyền user và admin trong dự án PHP của mình. Đây là nền tảng quan trọng cho mọi hệ thống quản trị, diễn đàn, CMS hoặc sàn thương mại điện tử.

Tham Gia Nhóm – Hỗ Trợ Lập Trình

Hỗ Trợ Đồ Án – ThueDoAn.vn

Liên quan
Hướng Dẫn Đồ Án

Checklist 10 bước kiểm tra cuối cùng trước khi nhấn nút nộp đồ án

Thời điểm chuẩn bị nhấn nút nộp đồ án luôn mang lại...

Hướng Dẫn Đồ Án

Tuyệt chiêu đối phó với những giảng viên hướng dẫn ‘khó tính’ nhất

Giai đoạn làm đồ án tốt nghiệp luôn đi kèm với vô...

Hướng Dẫn Đồ Án

Tại sao việc quản lý Source Code bằng Git lại quan trọng hơn bạn nghĩ?

Trong thế giới lập trình hiện đại, mã nguồn chính là linh...

Hướng Dẫn Đồ Án

Những chức năng ‘thừa’ khiến bạn tốn thời gian mà không được cộng điểm

Làm đồ án tốt nghiệp là một cuộc đua thực thụ với...

Hướng Dẫn Đồ Án

Cách xử lý khi đề tài bị trùng lặp ý tưởng với các khóa trước quá nhiều

Lựa chọn đề tài đồ án luôn là bước khởi đầu đầy...

Hướng Dẫn Đồ Án

Làm sao để giải trình với giảng viên khi code bị nghi ngờ là đi chép?

Trong quá trình thực hiện đồ án, việc tham khảo mã nguồn...

Hướng Dẫn Đồ Án

Cảnh báo: Những nguồn share code ‘rác’ trên mạng cần tuyệt đối tránh

Trong quá trình làm đồ án, việc tìm kiếm sự hỗ trợ...

Hướng Dẫn Đồ Án

Sai lầm khi chọn công nghệ quá khó so với năng lực thực tế của bản thân

Chọn đề tài và công nghệ cho đồ án luôn là bước...

Liên Hệ
Liên hệ để được tư vấn & hỗ trợ đồ án CNTT nhé bạn!