2011-01-24 6 views

Trả lời

102

Tôi cho rằng câu hỏi đầu tiên bạn cần hỏi là bạn cần những quyền nào và loại nào. Theo những gì sắp xếp, tôi có nghĩa là bạn muốn Model- hoặc Object-level. Để làm rõ sự khác biệt nói rằng bạn có một mẫu xe. Nếu bạn muốn cấp quyền trên tất cả các ô tô, thì Mức mô hình là thích hợp, nhưng nếu bạn muốn cấp quyền trên cơ sở mỗi ô tô, bạn muốn cấp Đối tượng. Bạn có thể cần cả hai và đây không phải là vấn đề như chúng ta sẽ thấy.

Đối với quyền Mẫu, Django xử lý các quyền này cho bạn ... chủ yếu. Đối với mỗi mô hình Django sẽ tạo quyền trong biểu mẫu 'appname.permissionname_modelname'. Nếu bạn có một ứng dụng được gọi là 'trình điều khiển' với mô hình Xe thì một quyền sẽ là 'drivers.delete_car'. Các quyền mà Django tự động tạo sẽ tạo, thay đổi và xóa. Đối với một số lý do lạ họ quyết định không bao gồm quyền đọc từ CRUD, bạn sẽ phải tự mình làm điều này. Lưu ý rằng Django đã quyết định thay đổi 'cập nhật' của CRUD thành 'thay đổi' vì một lý do nào đó. Để thêm quyền truy cập vào một mô hình, nói cho phép đọc, bạn sử dụng lớp Meta:

class Car(models.Model): 
    # model stuff here 
    class Meta: 
     permissions = ( 
      ("read_car", "Can read Car"), 
     ) 

Lưu ý rằng quyền là một bộ dữ liệu, nơi các mục tuple là sự cho phép như đã mô tả ở trên và một mô tả về sự cho phép mà . Bạn không phải tuân theo quy ước permname_modelname nhưng tôi thường gắn bó với nó.

Cuối cùng, để kiểm tra quyền truy cập, bạn có thể sử dụng has_perm:

obj.has_perm('drivers.read_car') 

đâu obj là hoặc là một tài khoản hoặc dụ Group. Tôi nghĩ rằng đó là đơn giản để viết một hàm cho việc này:

def has_model_permissions(entity, model, perms, app): 
    for p in perms: 
     if not entity.has_perm("%s.%s_%s" % (app, p, model.__name__)): 
      return False 
    return True 

đâu tổ chức là đối tượng để kiểm tra quyền truy cập vào (Nhóm hoặc tài khoản), mô hình là trường hợp của một người mẫu, perms là một danh sách các quyền như dây đàn để kiểm tra (ví dụ ['đọc', 'thay đổi']) và ứng dụng là tên ứng dụng dưới dạng chuỗi. Để làm việc kiểm tra tương tự như has_perm ở trên, bạn muốn gọi một cái gì đó như thế này:

result = has_model_permissions(myuser, mycar, ['read'], 'drivers') 

Nếu bạn cần phải sử dụng đối tượng hoặc hàng quyền (họ ý nghĩa giống nhau), sau đó Django có thể không thực sự giúp bạn bằng cách riêng của mình . Điều thú vị là bạn có thể sử dụng cả quyền của mô hình và đối tượng song song. Nếu bạn muốn các quyền đối tượng, bạn sẽ phải hoặc là write your own (nếu sử dụng 1,2+) hoặc tìm một dự án mà người khác đã viết, cái tôi thích là django-objectpermissions từ thời gian giặt.

+21

Đây là câu trả lời tuyệt vời cho các quyền, nhưng hầu như không chạm vào các nhóm và cách chúng hoạt động ở Django? – Simon

+3

Không có nhiều thứ gì cho các nhóm, chúng chủ yếu chỉ để nhóm người dùng lại với nhau để áp dụng các quyền, giống như các nhóm người dùng Linux. Bạn cho phép một Nhóm và nó mở rộng cho tất cả các thành viên của nhóm đó. Tài liệu nói tất cả đều thực sự: https://docs.djangoproject.com/en/dev/topics/auth/default/#groups. –

+0

Có vẻ như Django Advent đã biến mất, có một phiên bản của bài viết về cách viết các quyền đối tượng của riêng bạn trên Github: https://github.com/djangoadvent/djangoadvent-articles/blob/master/1.2/06_object-permissions.rst –