Không chắc chắn nếu bạn đã đọc về nó nhưng kim tự tháp không có hệ thống cấp phép thực sự tốt đẹp. Ủy quyền với ACL.
Làm thế nào để xử lý nó, nó thực sự chỉ phụ thuộc của bạn ... Bạn có thể có một bảng ACL
(object_id, cho phép/từ chối, ai? (Nhóm, userid), cho phép, theo thứ tự)
- object_id là một id duy nhất lên mức kỷ lục trong cơ sở dữ liệu của bạn
- cho phép/từ chối được những gì ACE này là phải làm ... cho phép hoặc từ chối truy cập
- ai? hoặc là một nhóm, tên người dùng hoặc bất cứ điều gì bạn muốn ví dụ system.everyone là tất cả mọi người
- phép là tham số cho phép trong view_config
- trật tự là một trong những điều quan trọng để thực hiện vấn đề
Ví dụ
__acl__ = [
(Deny, Everyone, 'view'),
(Allow, 'group:admin', 'view')
]
Mẫu này sẽ luôn từ chối xem ngay cả đối với quản trị viên ... Ngay khi kim tự tháp tìm thấy thứ gì đó cho bạn biết nếu bạn có thể thấy hoặc không thấy bản ghi, nó sẽ tự động ngừng tìm kiếm
__acl__ = [
(Allow, 'group:admin', 'view'),
(Deny, Everyone, 'view')
]
Điều này sẽ cho phép xem cho mọi quản trị viên chứ không phải cho bất kỳ ai khác.Đó là lý do tại sao bạn phải nhớ thứ tự của ACE của bạn.
Phần thú vị ở đây thực sự. Tất cả đều tốt. Bạn đã lập bản đồ acl thành bản ghi trong dữ liệu của bạn. Khi bạn tải ví dụ một trang ... Bạn sẽ phải tải acl và đặt chúng trong đối tượng của bạn.
myobject.__acl__ = load_acls(myobject)
Nếu bạn có cây dữ liệu. Bạn thậm chí không thể đặt acls.
Ví dụ, bạn có một trang web trông như thế
root
\--pages with acl
+---- page1 without acl
\---- page2 with acl
Khi nào bạn sẽ truy cập vào page1, nó sẽ kiểm tra cho acl nếu nó không thể tìm thấy nó, nó sẽ kiểm tra parent nếu cha mẹ có mã ACL, nó sẽ kiểm tra sự cho phép, nếu không nó sẽ kiểm tra cha mẹ cho đến khi bạn đến gốc. Nếu nó không thể tìm thấy sự cho phép, im không chắc chắn những gì sẽ xảy ra .. Tôi đoán nó sẽ cung cấp cho bạn một lỗi bị cấm hoặc lỗi vị ngữ. Rằng nó không thể tìm thấy cái nhìn thích hợp.
Điều đó nói rằng, để thực hiện công việc đó, bạn phải làm cho đối tượng nhận biết vị trí biết cha mẹ của họ.
Nhưng tại sao bạn muốn làm tất cả những điều đó?
Bạn có thể có ACL cho bất kỳ đối tượng nào và có quyền kiểm soát thực sự tốt về những ai có thể xem hoặc không phải mọi đối tượng trong cơ sở dữ liệu của bạn. Bạn cũng có thể đặt acl trực tiếp trong đối tượng lớp của bạn mà không có cơ sở dữ liệu.
miễn là acl của bạn nằm trong thuộc tính acl kim tự tháp sẽ có thể làm điều gì đó với nó. Nó không thực sự quan trọng như thế nào bạn có nó.
Kiểm tra này ra
http://pyramid.readthedocs.org/en/1.3-branch/tutorials/wiki/authorization.html
Hầu hết các RDBMS có một 'GRANT'/'lệnh REVOKE' được sử dụng để cho phép truy cập (Ở cấp độ khác nhau) để bảng/schema trong database. Một số người trong số họ thậm chí còn có khái niệm về nhóm người dùng, điều đó có nghĩa là bạn có thể thực hiện lệnh cho toàn bộ nhóm. Vì vậy, bạn có thể đang cố gắng làm điều gì đó ở cấp ứng dụng, mà đã có mặt ở cấp cơ sở dữ liệu (điều này sẽ an toàn hơn nhiều). –
Nhưng không phải là GRANT cho người dùng cơ sở dữ liệu của tôi? Và người dùng ứng dụng của tôi không có nghĩa là người dùng cơ sở dữ liệu –
'GRANT' _is_ cho người dùng cơ sở dữ liệu, vâng. Nhưng nếu bạn viết ứng dụng của mình để kiểm tra quyền (dựa trên ai/cái gì đã đăng nhập vào ứng dụng), bạn cũng có thể đăng nhập với tư cách người dùng cơ sở dữ liệu cụ thể (bạn có thể cung cấp chúng trong chuỗi kết nối, thường). Mà sẽ giúp với kiểm toán, cũng như kiểm soát truy cập. –