Vài ngày trước, một số đồng nghiệp của tôi đã tiếp cận tôi về một vấn đề với ứng dụng Nguồn mở có tên Makaut Buddy , một nền tảng chia sẻ ghi chú được thiết kế cho trường đại học của chúng tôi, nhằm giúp sinh viên chia sẻ các ghi chú hàng đầu, câu hỏi thi trước đây và hướng dẫn trên YouTube một cách hiệu quả .
Mặc dù họ đã phát triển thành công hệ thống tải tài nguyên lên nhưng họ gặp phải thách thức trong việc đảm bảo rằng chỉ những cá nhân được ủy quyền mới có thể tải nội dung lên.
Như được hiển thị trong bản demo bên dưới, bất kỳ người dùng nào cũng có thể tạo tài nguyên sau khi đăng ký. Điều này đặt ra một vấn đề lớn vì chúng tôi không thể quản lý những gì người dùng tải lên, một số thậm chí có thể đã tải lên nội dung có hại hoặc gây khó chịu.
Ban đầu, họ xác định vai trò Quản trị viên và cấp cho một nhóm cá nhân được chọn các đặc quyền quản trị. Tuy nhiên, khi số lượng vai trò tăng lên, mã ngày càng trở nên phức tạp và khó quản lý.
Đây là lúc tôi nảy ra ý tưởng viết bài này để nâng cao nhận thức về các cách quản lý ủy quyền hiệu quả bằng mô hình Kiểm soát truy cập dựa trên vai trò (RBAC) với sự trợ giúp của các công cụ ủy quyền của bên thứ ba như Giấy phép.
Ngoài việc triển khai RBAC, chúng tôi cũng giới thiệu hệ thống Phê duyệt yêu cầu truy cập. Hệ thống này đảm bảo rằng bất kỳ người dùng nào muốn tải nội dung lên trước tiên đều phải yêu cầu quyền truy cập, sau đó quản trị viên có thể phê duyệt hoặc từ chối. Lớp bảo mật bổ sung này giúp chúng tôi duy trì tính toàn vẹn của nội dung trên Makaut Buddy.
Trong bài viết này, tôi đã sử dụng JavaScript làm ngôn ngữ lập trình và Next.js làm khung. Tuy nhiên, các khái niệm được thảo luận ở đây không dành riêng cho ngôn ngữ và bạn có thể triển khai chúng bằng ngôn ngữ lập trình ưa thích của mình.
Đến cuối bài viết này, bạn sẽ biết cách triển khai mô hình RBAC cơ bản trong ứng dụng của mình.
Như đã nói, hãy đi sâu vào!
Bạn có nhớ những buổi sáng vội vã đến trường không? Nhân viên bảo vệ kiểm tra ID của bạn là một ví dụ hoàn hảo về xác thực. Họ đang xác minh danh tính của bạn với tư cách là sinh viên được phép vào trường. Nhưng đó chỉ là bước đầu tiên. Ngay cả sau khi được xác định, bạn sẽ không bước vào bất kỳ lớp học nào, phải không? Đó là nơi ủy quyền xuất hiện.
Hãy coi lịch học như sự ủy quyền của bạn. Nó cấp cho bạn quyền truy cập vào các khu vực cụ thể (lớp học) dựa trên vai trò của bạn (học sinh đăng ký vào lớp đó). Bạn sẽ không được phép vào phòng chờ của giáo viên hoặc khu vực hạn chế của thư viện - ngay cả khi bạn là sinh viên (đã được xác thực).
Sự khác biệt giữa Xác thực và Ủy quyền giống như hỏi "Bạn là ai?" vs “Bạn được phép làm gì?”
Việc ủy quyền rất quan trọng trong mọi tổ chức vì nó ngăn cản các cá nhân thực hiện những hành động mà họ không được phép thực hiện. Điều này đảm bảo sự an toàn của tổ chức và giúp ngăn ngừa tổn thất.
Hãy minh họa tuyên bố trên bằng một ví dụ:
Trong một công ty, có một số kỹ sư cấp cao có kinh nghiệm sâu sắc và một số thực tập sinh vẫn đang học hỏi. Bạn có thể tưởng tượng thảm họa sẽ xảy ra nếu cả kỹ sư cấp cao và thực tập sinh đều có cùng cấp độ quyền. Các thực tập sinh đang trong quá trình học tập có thể vô tình mắc phải sai lầm nào đó mà công ty sẽ phải trả giá. Trong những tình huống như thế này, Mô hình kiểm soát truy cập dựa trên vai trò hoạt động tốt nhất vì các quyền không được chỉ định cho các cá nhân thay vào đó các quyền được chỉ định cho các vai trò. Ví dụ: chỉ kỹ sư cấp cao hoặc trưởng nhóm công nghệ mới có thể Xóa Tài nguyên trong khi tất cả thực tập sinh chỉ có thể xem và quản lý tài nguyên.
Tiếp theo, hãy xem cách chúng ta có thể triển khai RBAC trong một ứng dụng.
Đầu tiên chúng ta cần xác định vai trò và gán quyền cho từng vai trò.
Lưu ý: Vai trò là vị trí hoặc mục đích mà ai đó có trong tổ chức, chúng tôi cần các vai trò để có thể phân biệt giữa các cá nhân dựa trên các quyền hoặc đặc quyền được gán cho vai trò đó.
Chúng ta cần một cách để gán vai trò cho từng người dùng ứng dụng. Điều này thường được thực hiện sau khi người dùng đăng ký.
Chúng tôi cần một API trong phần phụ trợ của mình để thực hiện thao tác mà người dùng muốn thực hiện và kiểm tra quyền của người dùng. Sơ đồ dưới đây sẽ giúp bạn hiểu rõ hơn:
Tuy nhiên, chúng tôi sẽ không triển khai toàn bộ mô hình từ đầu. Thay vào đó, chúng tôi sẽ sử dụng công cụ ủy quyền của bên thứ ba có tên là Permit. Công cụ này sẽ giúp toàn bộ quá trình thiết lập ủy quyền trở nên trơn tru và hiệu quả đối với chúng tôi, để bạn có thể làm việc trên các tính năng thực sự quan trọng.
Sơ đồ bên dưới cho bạn thấy cách chúng tôi sẽ tận dụng Giấy phép để triển khai RBAC trong các ứng dụng của mình:
Trong phần này, chúng tôi sẽ hướng dẫn các bước để triển khai Kiểm soát truy cập dựa trên vai trò (RBAC) bằng Giấy phép.
Vì chúng tôi đang sử dụng Giấy phép để thiết lập mô hình RBAC, trước tiên chúng tôi cần tạo tài khoản Giấy phép và không gian làm việc:
Bây giờ chúng ta cần tạo Tài nguyên là thực thể mà chúng ta muốn kiểm soát quyền truy cập trong ứng dụng của mình.
Ví dụ: trong một ứng dụng ghi chú, tài nguyên sẽ là Ghi chú và các hành động có thể là Tạo , Đọc, Cập nhật và Xóa.
Để tạo một tài nguyên:
Trong ví dụ trên, tên Tài nguyên là Ghi chú và các hành động mà người dùng được phép thực hiện là Tạo, Đọc, Cập nhật và Xóa.
Sau khi tạo Tài nguyên, chúng ta phải xác định các vai trò sẽ tồn tại trong ứng dụng của mình.
Trong trường hợp này, vì ứng dụng này là một ứng dụng chia sẻ ghi chú của một trường đại học nên các vai trò sẽ là:
Khi chúng tôi đã tạo cả hai vai trò, bây giờ chúng tôi phải chỉ định các hành động mà mỗi vai trò có thể thực hiện từ trình chỉnh sửa chính sách của mình, như hiển thị bên dưới:
Bây giờ tài khoản Permit của bạn đã được định cấu hình, bạn có thể bắt đầu tạo các API phụ trợ để liên lạc với Permit. Chúng tôi sẽ sử dụng SDK Node.js do Permit cung cấp. Bạn có thể tìm thấy SDK cho ngôn ngữ lập trình ưa thích của mình trong Tài liệu cấp phép.
Đồng bộ hóa người dùng và chỉ định vai trò mặc định
Trước tiên, chúng tôi cần đảm bảo rằng mỗi người dùng đăng ký trong ứng dụng của chúng tôi đều được đồng bộ hóa với thư mục giấy phép và được gán vai trò mặc định là Sinh viên.
Để làm điều này, chúng ta cần tạo API phụ trợ như dưới đây:
API này thực hiện 2 việc:
createUser
.assignRole
.
Bạn có thể đọc thêm về tất cả các API mà Permit cung cấp tại tài liệu giấy phép
Nhận vai trò người dùng
Tiếp theo, chúng ta cần tạo một API phụ trợ nhận vai trò của người dùng từ Permit.io và gửi nó trở lại giao diện người dùng.
API hiển thị bên dưới giúp người dùng sử dụng permit.api.users.get(user_key)
API này nhận vai trò người dùng mà chúng tôi có thể thao tác các thành phần giao diện người dùng của mình để chỉ cho phép những người có vai trò đặc biệt mới có thể nhìn thấy nó.
Bạn cũng có thể kiểm tra hàm allow.check() để xác minh xem người dùng có vai trò nhất định có được phép thực hiện một thao tác hay không.
Với điều này, chúng tôi đã triển khai thành công mô hình RBAC bằng Permit. Giờ đây, chúng tôi có thể tích hợp các tuyến phụ trợ với khung giao diện người dùng hoặc thư viện mà bạn chọn để hoàn tất quá trình thiết lập.
Để hoàn tất quá trình thiết lập, chúng tôi cần một thành phần cho phép người dùng yêu cầu nâng cấp vai trò:
Các thành phần giấy phép là một phần của “Permit Share-If”, là một bộ gồm các thành phần giao diện người dùng có thể nhúng, dựng sẵn giúp việc chia sẻ quyền truy cập trong các ứng dụng trở nên dễ dàng. Được thiết kế để cung cấp khả năng kiểm soát truy cập đầy đủ chức năng, chúng giúp việc quản lý quyền ủy quyền cho người dùng của bạn trở nên đơn giản và an toàn.
Thế là chúng ta đã tạo xong các phần tử.
Trước khi sử dụng các phần tử, chúng ta cần tạo API phụ trợ để đăng nhập người dùng vào phần tử giấy phép,
Lưu ý: Điều quan trọng là người dùng phải đăng nhập càng sớm càng tốt, tốt nhất là ngay sau khi đăng ký.
Bây giờ, hãy xem mã:
Mã API phục vụ tại điểm cuối /api/v1/login_permit/?userkey=user_key
:
Mã giao diện người dùng để triển khai đăng nhập sẽ trông như thế này:
Thế là chúng ta đã thiết lập xong mã của mình.
Bây giờ, chúng ta chỉ cần đi tới bảng điều khiển giấy phép và sao chép cả iframe quản lý người dùng và iframe yêu cầu truy cập, như hiển thị bên dưới:
Bây giờ, khi đã có mã, chúng ta cần thêm iframe
vào giao diện người dùng nơi chúng ta muốn hiển thị các thành phần cho người dùng, chúng ta cần:
Với điều này, chúng tôi đã thiết lập thành công hệ thống phê duyệt quyền truy cập nơi người dùng có thể yêu cầu nâng cấp vai trò và quản trị viên có thể phê duyệt hoặc từ chối các yêu cầu này.
Bản demo này cho thấy cách người dùng có vai trò "Quản trị viên" có thể truy cập tiện ích tải lên
Bản demo này minh họa cách người dùng có vai trò "Sinh viên" không thể nhìn thấy tiện ích tải lên và có thể yêu cầu nâng cấp lên vai trò "Quản trị viên":
Bản demo này cho thấy cách người dùng có đặc quyền có thể phê duyệt yêu cầu nâng cấp vai trò:
Bản demo này minh họa cách người dùng sau khi được nâng cấp từ "Sinh viên" lên "Quản trị viên" có quyền truy cập vào tiện ích tải lên
Đó là nó!
Cảm ơn bạn đã đọc đến đây.
Trong hướng dẫn này, chúng ta đã khám phá ủy quyền và hiểu tại sao ủy quyền lại rất quan trọng trong bất kỳ ứng dụng nào. Chúng tôi cũng đã xem xét cách có thể thiết lập và định cấu hình Giấy phép để bảo mật ứng dụng và kiểm soát quyền truy cập của người dùng dựa trên vai trò của họ.
Bài viết này chỉ là phần nổi của tảng băng chìm về ủy quyền và mô hình RBAC. Bạn có thể xem xét ABAC và ReBAC để có được Ủy quyền chi tiết hơn.