- vừa được xem lúc

[Hãy thử] Triển khai Hệ thống Phân quyền Chi tiết trong Phần mềm CRM

0 0 3

Người đăng: Nguyễn Hữu Dũng

Theo Viblo Asia

1. Giới thiệu

Hệ thống phân quyền chi tiết trong CRM đảm bảo rằng người dùng chỉ được truy cập vào dữ liệu và tính năng phù hợp với vai trò của họ. Điều này giúp tăng cường bảo mật, tối ưu hóa quy trình làm việc và giảm thiểu lỗi do truy cập trái phép. Bài viết này sẽ hướng dẫn bạn xây dựng hệ thống phân quyền chi tiết sử dụng cơ chế kiểm soát truy cập dựa trên vai trò (Role-Based Access Control - RBAC) trong CRM, kèm theo các ví dụ và mã code minh họa.

2. Mục tiêu

  • Triển khai hệ thống phân quyền dựa trên vai trò trong ứng dụng CRM.
  • Hạn chế quyền truy cập vào dữ liệu và tính năng dựa trên vai trò của người dùng.
  • Đảm bảo khả năng mở rộng cho các vai trò và quyền động.

3. Ứng dụng thực tế

  • Vai trò Nhân viên bán hàng: Có thể xem và chỉnh sửa thông tin khách hàng nhưng không được thay đổi cài đặt hệ thống.
  • Vai trò Quản lý: Có thể truy cập báo cáo doanh số và quản lý hiệu suất nhóm.
  • Vai trò Quản trị viên: Có toàn quyền, bao gồm quản lý vai trò và phân quyền.

4. Công nghệ sử dụng

  • Frontend: ReactJS để xây dựng giao diện người dùng.
  • Backend: Node.js để xử lý phân quyền và quản lý vai trò người dùng.
  • Cơ sở dữ liệu: MongoDB để lưu trữ vai trò, quyền hạn và dữ liệu người dùng.
  • Middleware: JSON Web Tokens (JWT) để xác thực người dùng an toàn.

5. Hướng dẫn triển khai

Bước 1: Định nghĩa Vai trò và Quyền

**Tạo cấu trúc cơ sở dữ liệu cho vai trò và quyền. **

Ví dụ:

const mongoose = require("mongoose"); const roleSchema = new mongoose.Schema({ name: { type: String, required: true }, permissions: [String], // Ví dụ: ["view_customers", "edit_customers"]
}); const Role = mongoose.model("Role", roleSchema);
module.exports = Role;

Bước 2: Gán Vai trò cho Người dùng

Mở rộng cấu trúc người dùng để bao gồm tham chiếu đến vai trò.

const userSchema = new mongoose.Schema({ username: { type: String, required: true }, password: { type: String, required: true }, role: { type: mongoose.Schema.Types.ObjectId, ref: "Role" }, // Tham chiếu đến Role
}); const User = mongoose.model("User", userSchema);
module.exports = User;

Bước 3: Middleware Kiểm tra Phân quyền

Tạo middleware để kiểm tra người dùng có quyền truy cập cần thiết hay không.

const User = require("./models/User");
const Role = require("./models/Role"); const checkPermission = (requiredPermission) => { return async (req, res, next) => { try { const user = await User.findById(req.user.id).populate("role"); if (!user || !user.role.permissions.includes(requiredPermission)) { return res.status(403).json({ message: "Truy cập bị từ chối" }); } next(); } catch (error) { res.status(500).json({ message: "Lỗi máy chủ" }); } };
}; module.exports = checkPermission;

Bước 4: API Endpoint với Quyền Truy cập Vai trò

Sử dụng middleware để bảo vệ các route cụ thể.


const express = require("express");
const checkPermission = require("./middleware/checkPermission");
const router = express.Router(); // Route chỉ cho phép người dùng có quyền "view_customers"
router.get( "/customers", checkPermission("view_customers"), async (req, res) => { const customers = await Customer.find(); res.json(customers); }
); // Route chỉ cho phép người dùng có quyền "manage_roles" router.post( "/roles", checkPermission("manage_roles"), async (req, res) => { const { name, permissions } = req.body; const role = new Role({ name, permissions }); await role.save(); res.json({ message: "Vai trò đã được tạo", role }); }
); module.exports = router;

Bước 5: Giao diện Quản lý Vai trò

Tạo một component ReactJS cho quản trị viên để gán vai trò cho người dùng.

import React, { useState, useEffect } from "react"; const AssignRole = () => { const [users, setUsers] = useState([]); const [roles, setRoles] = useState([]); const [selectedUser, setSelectedUser] = useState(""); const [selectedRole, setSelectedRole] = useState(""); useEffect(() => { // Lấy dữ liệu người dùng và vai trò từ API fetch("/api/users").then((res) => res.json().then(setUsers)); fetch("/api/roles").then((res) => res.json().then(setRoles)); }, []); const assignRole = async () => { await fetch(`/api/users/${selectedUser}/role`, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ roleId: selectedRole }), }); alert("Gán vai trò thành công!"); }; return ( <div> <h1>Gán Vai trò</h1> <select onChange={(e) => setSelectedUser(e.target.value)}> <option value="">Chọn Người dùng</option> {users.map((user) => ( <option key={user.id} value={user.id}> {user.username} </option> ))} </select> <select onChange={(e) => setSelectedRole(e.target.value)}> <option value="">Chọn Vai trò</option> {roles.map((role) => ( <option key={role.id} value={role.id}> {role.name} </option> ))} </select> <button onClick={assignRole}>Gán</button> </div> );
}; export default AssignRole;

6. Lợi ích của Hệ thống

  • Tăng cường Bảo mật: Ngăn chặn truy cập trái phép vào dữ liệu nhạy cảm.
  • Khả năng Mở rộng: Dễ dàng thêm hoặc chỉnh sửa vai trò và quyền khi cần thiết.
  • Hiệu quả: Tối ưu hóa quy trình làm việc bằng cách giới hạn quyền truy cập không cần thiết.

7. Kết luận

Hệ thống phân quyền chi tiết không chỉ tăng cường bảo mật mà còn cải thiện hiệu quả hoạt động. Bằng cách triển khai các bước trên, phần mềm CRM của bạn có thể hỗ trợ các vai trò động, giúp thích ứng tốt với nhiều nhu cầu kinh doanh khác nhau.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 398

- vừa được xem lúc

Hướng dẫn làm bot Facebook messenger cho tài khoản cá nhân

Giới thiệu. Trong bài viết trước thì mình có hướng dẫn các bạn làm chatbot facebook messenger cho fanpage. Hôm nay mình sẽ hướng dẫn các bạn tạo chatbot cho một tài khoản facebook cá nhân. Chuẩn bị.

0 0 224

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 2

trong phần 1 mình đã giới thiệu về puppeteer và tạo được 1 project cùng một số file đầu tiên để các bạn có thể crawl dữ liệu từ một trang web bất kỳ. Bài này mình sẽ tiếp nối bài viết trước để hoàn thiện seri này.

0 0 73

- vừa được xem lúc

Điều React luôn giữ kín trong tim

■ Mở đầu. Ngồi viết bài khi đang nghĩ vu vơ chuyện con gà hay quả trứng có trước, mình phân vân chưa biết sẽ chọn chủ đề gì để chúng ta có thể cùng nhau bàn luận.

0 0 59

- vừa được xem lúc

Gửi Mail với Nodejs và AWS SES

AWS SES. AWS SES là gì.

0 0 83

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 1

Bài viết này mình sẽ giới thiệu cho các bạn craw dữ liệu của web site sử dụng nodejs và Puppeteer. .

0 0 164