phân quyền trong python
Đoạn đó nằm ngay trong route employee_detail tôi vừa sửa (file main.py đã gửi). Cụ thể là 2 dòng này:
Cụ thể trong route employee_detail (dòng ~2380–2401 trong file mới):
is_admin = (current_role == "admin")
is_self = (current_user_id == user_id)
is_manager_of_unit = (
current_role == "manager"
and session.get("group_id") is not None
and user.group_id == session.get("group_id")
)
is_hr_privileged = _is_hr_privileged_user() # ← dòng này: check "thuộc PHÒNG HCNS"
is_level_granted = _level_grants_current_request() # ← dòng này: check "được cấp Level qua Phân quyền Menu"
if not (is_admin or is_self or is_manager_of_unit or is_hr_privileged or is_level_granted):
abort(403)
# Trưởng đơn vị xem người KHÁC trong đơn vị -> readonly.
# Còn HCNS / Level-granted / admin / tự xem mình -> vẫn được SỬA (readonly=False)
readonly = is_manager_of_unit and not (is_admin or is_self or is_hr_privileged or is_level_granted)Giải thích 2 hàm helper đó (đã có sẵn từ trước trong code, tôi chỉ gọi lại, không viết mới):
_is_hr_privileged_user()— định nghĩa ở dòng 737, kiểm trasession["group_id"]của người đang đăng nhập có trùng nhóm tên"PHÒNG HCNS"không (không phân biệt hoa thường). Nếu đúng → coi như có toàn quyền, bất kểrolelà gì._level_grants_current_request()— định nghĩa ở dòng 696, kiểm tra xem route hiện tại (request.path, tức/admin/users/...) có được Admin khai báo trong bảng MenuItem (trang "Phân quyền Menu") với 1 mã Level nào đó không, và tài khoản đang đăng nhập có đủ Level đó không (session["access_levels"]).
Nhờ chèn 2 điều kiện này vào if not (...), hai nhóm "đặc quyền" cũ (HCNS và Level) không bị mất quyền khi tôi thêm rule mới cho manager — logic cũ y nguyên, chỉ thêm is_manager_of_unit vào danh sách được phép, và dùng chính is_hr_privileged/is_level_granted để quyết định họ được sửa (không bị ép readonly) chứ không chỉ được xem.

