Giả sử cấu trúc cơ sở dữ liệu sau (có thể sửa đổi nếu cần) ...
Tôi đang tìm kiếm một cách hay để xác định "quyền hiệu quả" cho một người dùng nhất định trên một trang nhất định theo cách cho phép tôi trả lại một hàng có chứa Trang và các quyền hiệu quả.
Tôi nghĩ rằng giải pháp lý tưởng có thể bao gồm chức năng sử dụng CTE để thực hiện đệ quy cần thiết để đánh giá "quyền hiệu quả" cho một hàng trang nhất định cho người dùng hiện tại.
Bối cảnh và chi tiết thực hiện
Lược đồ trên biểu thị điểm bắt đầu cho một hệ thống quản lý nội dung, trong đó người dùng có thể được cấp quyền bằng cách thêm và xóa khỏi vai trò.
Các tài nguyên trong hệ thống (ví dụ: các trang) được liên kết với các vai trò để cấp cho nhóm người dùng được liên kết với vai trò đó các quyền mà nó cấp.
Ý tưởng là có thể dễ dàng khóa người dùng bằng cách từ chối tất cả vai trò và thêm trang cấp gốc trong cây vào vai trò đó và sau đó thêm người dùng vào vai trò đó.
Điều này sẽ cho phép cấu trúc quyền vẫn được giữ nguyên khi (ví dụ) một nhà thầu làm việc cho công ty không có sẵn trong thời gian dài, điều này sau đó cũng sẽ cho phép cấp quyền tương tự bằng cách loại bỏ người dùng khỏi một vai trò đó .
Quyền dựa trên các quy tắc loại ACL điển hình có thể áp dụng cho hệ thống tệp bằng cách tuân theo các quy tắc này.
Các quyền CRUD là các bit nullable để các giá trị khả dụng là true, false, không được xác định trong trường hợp sau đây là true:
- sai + bất cứ điều gì = sai
- đúng + không xác định = đúng
- đúng + đúng = đúng
- không xác định + không xác định = không xác định
Nếu bất kỳ quyền nào là sai -> sai Khác nếu có là đúng -> đúng Khác (tất cả không được xác định) -> sai
Nói cách khác, bạn không nhận được quyền đối với bất cứ điều gì trừ khi bạn được cấp chúng thông qua vai trò thành viên và quy tắc từ chối ghi đè quy tắc cho phép.
"Tập hợp" các quyền này áp dụng cho tất cả các quyền được áp dụng cho cây lên đến và bao gồm trang hiện tại, nói cách khác: Nếu sai trong bất kỳ vai trò nào được áp dụng cho bất kỳ trang nào trong cây cho trang này thì kết quả là sai , nhưng nếu toàn bộ cây cho đến đây không được xác định thì trang hiện tại chứa quy tắc đúng thì kết quả là đúng ở đây nhưng sẽ là sai đối với cha mẹ.
Tôi muốn giữ lỏng cấu trúc db nếu có thể, hãy nhớ rằng mục tiêu của tôi ở đây là có thể làm một cái gì đó như: select * from pages where effective permissions (read = true) and user = ?
vì vậy mọi giải pháp sẽ có thể cho phép tôi có một bộ truy vấn có quyền truy cập hiệu quả trong chúng một cách nào đó (trả lại chúng là tùy chọn miễn là tiêu chí có thể được chỉ định).
Giả sử tồn tại 2 trang trong đó 1 là con của hai vai trò khác và 2 vai trò tồn tại, một cho người dùng quản trị viên và 1 cho người dùng chỉ đọc, cả hai đều được liên kết đến trang cấp gốc mà tôi mong đợi để xem thứ gì đó như đầu ra dự kiến:
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False
Thảo luận thêm về câu hỏi này có thể được tìm thấy trong phòng trò chuyện trang web chính bắt đầu từ đây .