Bỏ qua đến nội dung chính

Menu Permissions

Chúng ta bắt đầu bằng việc giới thiệu một ví dụ về Spring Boot với hệ thống menu. Ví dụ này sử dụng jCasbin để quản lý quyền truy cập menu. Cuối cùng, nó nhằm mục đích trừu tượng hóa một middleware, cụ thể cho quyền truy cập menu, có thể mở rộng sang các ngôn ngữ khác được Casbin hỗ trợ, như Go và Python.

1. Tệp Cấu Hình

Bạn cần thiết lập quản lý vai trò và quyền truy cập trong tệp policy.csv, cùng với các mối quan hệ cha-con giữa các mục menu. Để biết thêm chi tiết, vui lòng tham khảo kho lưu trữ GitHub này.

1.1 Tổng Quan

Sử dụng policy.csv, bạn có thể cấu hình linh hoạt quyền truy cập của vai trò và cấu trúc menu để kiểm soát truy cập chi tiết. Tệp cấu hình này định nghĩa quyền truy cập cho các vai trò khác nhau trên các mục menu, liên kết giữa người dùng và vai trò, và các mối quan hệ phân cấp giữa các mục menu.

1.2 Định Nghĩa Quyền Truy Cập (Policies)

  • Quy Tắc Chính Sách: Chính sách được định nghĩa với tiền tố p, chỉ định vai trò (sub) và quyền của họ (act) trên các mục menu (obj), cùng với hiệu ứng của quy tắc (eft), trong đó allow chỉ ra quyền được cấp và deny chỉ ra quyền bị từ chối.

Ví dụ:

  • p, ROLE_ROOT, SystemMenu, read, allow có nghĩa là vai trò ROLE_ROOT có quyền đọc đối với mục menu SystemMenu.
  • p, ROLE_ROOT, UserMenu, read, deny có nghĩa là vai trò ROLE_ROOT bị từ chối quyền đọc đối với mục menu UserMenu.

1.3 Vai trò và Liên kết Người dùng

  • Kế thừa Vai trò: Mối quan hệ giữa người dùng và vai trò, cũng như hệ thống phân cấp vai trò được định nghĩa với tiền tố g. Điều này cho phép người dùng kế thừa quyền từ một hoặc nhiều vai trò.

Ví dụ:

  • g, user, ROLE_USER có nghĩa là người dùng user được gán vai trò ROLE_USER.
  • g, ROLE_ADMIN, ROLE_USER có nghĩa là ROLE_ADMIN kế thừa quyền từ ROLE_USER.

1.4 Hệ thống phân cấp mục menu

  • Mối quan hệ Menu: Mối quan hệ cha-con giữa các mục menu được định nghĩa với tiền tố g2, giúp xây dựng cấu trúc của menu.

Ví dụ:

  • g2, UserSubMenu_allow, UserMenu chỉ ra rằng UserSubMenu_allow là một submenu của UserMenu.
  • g2, (NULL), SystemMenu chỉ ra rằng SystemMenu không có mục submenu nào, nghĩa là nó là một mục menu cấp cao.

1.5 Kế thừa Quyền Truy cập Menu và Quy tắc Mặc định

Khi quản lý quyền truy cập menu với jCasbin, mối quan hệ quyền giữa menu cha và menu con tuân theo các quy tắc kế thừa cụ thể, với hai quy tắc mặc định quan trọng:

Kế thừa Quyền của Menu Cha:

Nếu một menu cha được cấp quyền allow một cách rõ ràng, tất cả các submenu của nó cũng mặc định là allow trừ khi được đánh dấu cụ thể là deny. Điều này có nghĩa là một khi một menu cha có thể truy cập được, các submenu của nó cũng có thể truy cập được theo mặc định.

Xử lý Menu Cha Không Có Cài Đặt Quyền Trực Tiếp:

Nếu một menu cha không có cài đặt quyền trực tiếp (không được cho phép cũng không bị từ chối) nhưng có ít nhất một submenu được cấp quyền allow một cách rõ ràng, thì menu cha đó được coi là có quyền allow ngầm định. Điều này đảm bảo người dùng có thể điều hướng đến các submenu này.

1.6 Quy tắc Thừa kế Quyền Đặc biệt

Về việc thừa kế quyền giữa các vai trò, đặc biệt trong các tình huống liên quan đến quyền deny, cần tuân theo các quy tắc sau để đảm bảo an ninh hệ thống và kiểm soát quyền chính xác:

Phân biệt Giữa Từ chối Rõ ràng và Từ chối Mặc định:

Nếu một vai trò, như ROLE_ADMIN, bị từ chối truy cập vào một mục menu như AdminSubMenu_deny (được đánh dấu là deny), thì ngay cả khi vai trò này được thừa kế bởi một vai trò khác (ví dụ: ROLE_ROOT), vai trò thừa kế không được phép truy cập vào mục menu bị từ chối đó. Điều này đảm bảo các chính sách bảo mật rõ ràng không bị bỏ qua do thừa kế vai trò.

Thừa kế Quyền Từ chối Mặc định:

Ngược lại, nếu việc từ chối truy cập vào một mục menu của một vai trò (ví dụ: UserSubMenu_deny) là mặc định (không được đánh dấu rõ ràng là deny, nhưng vì nó không được cấp rõ ràng allow), thì khi vai trò này được thừa kế bởi một vai trò khác (ví dụ: ROLE_ADMIN), vai trò thừa kế có thể ghi đè trạng thái deny mặc định, cho phép truy cập vào các mục menu này.

1.7 Mô tả Ví dụ

chính sách:

p, ROLE_ROOT, SystemMenu, read, allow
p, ROLE_ROOT, AdminMenu, read, allow
p, ROLE_ROOT, UserMenu, read, deny
p, ROLE_ADMIN, UserMenu, read, allow
p, ROLE_ADMIN, AdminMenu, read, allow
p, ROLE_ADMIN, AdminSubMenu_deny, read, deny
p, ROLE_USER, UserSubMenu_allow, read, allow

g, user, ROLE_USER
g, admin, ROLE_ADMIN
g, root, ROLE_ROOT
g, ROLE_ADMIN, ROLE_USER

g2, UserSubMenu_allow, UserMenu
g2, UserSubMenu_deny, UserMenu
g2, UserSubSubMenu, UserSubMenu_allow
g2, AdminSubMenu_allow, AdminMenu
g2, AdminSubMenu_deny, AdminMenu
g2, (NULL), SystemMenu
TênMenuVAI_TRÒ_GỐCVAI_TRÒ_QUẢN_TRỊVAI_TRÒ_NGƯỜI_DÙNG
SystemMenu
UserMenu
UserSubMenu_allow
UserSubSubMenu
UserSubMenu_deny
AdminMenu
AdminSubMenu_allow
AdminSubMenu_deny

2. Quản lý Quyền Truy Cập Menu

Danh sách tất cả các mục menu có thể truy cập bởi một tên người dùng cụ thể có thể được xác định thông qua hàm findAccessibleMenus() có sẵn trong MenuService. Để kiểm tra xem một người dùng cụ thể có quyền truy cập vào một mục menu được chỉ định hay không, có thể sử dụng phương thức checkMenuAccess(). Phương pháp này đảm bảo rằng quyền truy cập menu được kiểm soát hiệu quả, tận dụng khả năng của jCasbin để quản lý quyền truy cập một cách hiệu quả.