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 menuSystemMenu
.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 menuUserMenu
.
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ùnguser
đượ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ằngUserSubMenu_allow
là một submenu củaUserMenu
.g2, (NULL), SystemMenu
chỉ ra rằngSystemMenu
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ênMenu | VAI_TRÒ_GỐC | VAI_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ả.