RivaLMS
Phân quyền

Vai trò & phân quyền

Mỗi tài khoản có đúng một vai trò. Vai trò cao hơn vào được khu vực của các vai trò thấp hơn. Tên vai trò trong code và cơ sở dữ liệu giữ nguyên tiếng Anh.

Thứ bậc vai trò

Bốn vai trò, từ cao xuống thấp.

Quản trị hệ thống
SUPERADMINBậc 4

Quản lý mọi tài khoản, kể cả Quản lý đào tạo và Quản trị hệ thống, và cấu hình hệ thống. Trang tổng quan: /superadmin.

Quản lý đào tạo
ADMINBậc 3

Quản lý khoa, khóa học, lớp học và phân công giảng viên; tạo, khóa, đặt lại mật khẩu tài khoản Học viên và Giảng viên; xem thống kê. Trang tổng quan: /admin.

Giảng viên
TRAINERBậc 2

Soạn bài học và tài liệu cho các khóa học được phân công, theo dõi các lớp mình phụ trách. Trang tổng quan: /trainer.

Học viên
LEARNERBậc 1

Ghi danh vào lớp học, học bài, nộp bài tập, theo dõi tiến độ, XP và huy hiệu. Trang tổng quan: /learner.

Quyền hạn

Các quyền chính của từng vai trò. Mọi API đều tự kiểm tra quyền, không chỉ dựa vào giao diện.

Thao tácHọc viênGiảng viênQuản lý đào tạoQuản trị hệ thống
Ghi danh, học bài, nộp bài tập
Soạn bài học và tài liệu
Quản lý khoa, khóa học, lớp học
Tạo, khóa, đặt lại mật khẩu tài khoản Học viên và Giảng viên
Quản lý tài khoản Quản lý đào tạo và Quản trị hệ thống
Cấu hình hệ thống

Giảng viên chỉ soạn nội dung cho khóa học mình được phân công.

Gán vai trò

Vai trò được chọn khi tạo tài khoản và có thể đổi sau đó. Quản lý đào tạo chỉ gán được vai trò Học viên hoặc Giảng viên; chỉ Quản trị hệ thống gán được Quản lý đào tạo và Quản trị hệ thống. Không ai tự đổi được vai trò của chính mình.

Middleware

Các trang được bảo vệ bằng middleware của Next.js, dựa trên vai trò trong JWT.

Cấu hình route

// src/middleware.ts
const roleRoutes = {
  "/learner": ["LEARNER", "TRAINER", "ADMIN", "SUPERADMIN"],
  "/trainer": ["TRAINER", "ADMIN", "SUPERADMIN"],
  "/admin": ["ADMIN", "SUPERADMIN"],
  "/superadmin": ["SUPERADMIN"],
};

Mỗi tiền tố yêu cầu một trong các vai trò liệt kê. Người chưa đăng nhập được chuyển tới /login?callbackUrl=…; người không đủ quyền được chuyển về trang tổng quan của mình.

Route công khai

const publicRoutes = [
  "/",              // Trang chủ
  "/login",         // Đăng nhập
  "/register",      // Tự đăng ký (trả 404 khi bị tắt)
  "/about",         // Giới thiệu
  "/privacy", "/terms", "/cookies", "/accessibility", // Trang pháp lý
  "/docs",          // Tài liệu hướng dẫn
  // Danh mục khóa học (/courses, /categories) yêu cầu đăng nhập.
];

Các route này truy cập được khi chưa đăng nhập. Middleware không chạy cho /api/*; mỗi route handler tự kiểm tra đăng nhập và quyền.