2012-04-17 26 views
5

Tôi hiện đang phát triển một trang web Python nhỏ sử dụng Kim tự tháp.
Nhưng tôi không biết cách thiết kế hệ thống cấp phép.
Hệ thống phải rất linh hoạt: Tôi phải thiết lập kết nối giữa nhiều bảng khác nhau.
Thay vì viết bảng một phép cho mỗi biến thể tôi nghĩ đến chỉ cần tạo một bảng - Tôi gọi nó là PermissionCollection:Thực tiễn tốt nhất khi thiết kế hệ thống cấp phép

PermissionCollection:

  • permissionCollectionId - PrimaryKey
  • onType = ENUM ("USER", "giáo viên", "GROUP", "HỌC" ...)
  • onId = Integer

và bảng Permission:

  • permissionId - PrimaryKey
  • chính
  • giá trị
  • permissionCollectionId - ForeignKey

tôi sẽ xác định PermissionCollections tiêu chuẩn cho tất cả các mối quan hệ có thể mã hóa cứng trong các nguồn và nếu một người sử dụng, khóa học , giáo viên ... có các quyền đặc biệt, tôi sẽ tạo một PermissionCollection mới và thêm quyền cho nó.

Tôi rất mới lập trình web và không biết liệu phương pháp này có hữu ích hay không. Hoặc nếu một cái gì đó như thế này thậm chí còn tồn tại. Tôi nghĩ rằng ACL Kim tự tháp không phải là công cụ phù hợp cho nhiệm vụ này, phải không?

+0

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). –

+0

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 –

+0

'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. –

Trả lời

4

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

+0

Tốt. cảm ơn bạn. Và tôi cũng có thể sử dụng bàn của tôi? Trong cách tiếp cận của bạn: làm thế nào ứng dụng có thể tìm ra nếu ai: 1 là viết tắt của người dùng với id 1 một nhóm với id 1? Vì vậy, tôi chỉ viết một hàm tạo bộ tlle acl này cho mọi phần tử trong cây truyền tải. Tôi có thể tải acl trong contructor? –

+0

Mục đích của oder là gì? –

+0

yeah bạn có thể tải acl bất cứ nơi nào miễn là dụ của bạn như __acl__ thiết lập vào một danh sách các tuple (ACE). –

Các vấn đề liên quan