Làm cách nào để sử dụng các nhóm và quyền của Django?


Câu trả lời:


121

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 cách sắp xếp, ý tôi là bạn muốn Model- hay Object-level. Để làm rõ sự khác biệt, hãy nói rằng bạn có một chiếc xe mô hình. Nếu bạn muốn cấp quyền trên tất cả các ô tô, thì Cấp kiểu là phù hợp, nhưng nếu bạn muốn cấp quyền trên cơ sở từng ô 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 Model, Django xử lý chúng cho bạn ... chủ yếu. Đối với mỗi kiểu máy, Django sẽ tạo quyền ở dạng '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 kiểu Xe thì một quyền sẽ là 'drivers.delete_car'. Các quyền mà Django tự động tạo sẽ là tạo, thay đổi và xóa. Vì một số lý do kỳ lạ mà họ quyết định không bao gồm quyền đọc từ CRUD, bạn sẽ phải tự mình thực hiện việc 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 số lý do. Để thêm nhiều quyền hơn vào một mô hình, chẳng hạn như quyền đọ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 tập hợp các bộ giá trị, trong đó các bộ giá trị là quyền như được mô tả ở trên và mô tả về quyền đó. Bạn không cần 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, bạn có thể sử dụng has_perm:

obj.has_perm( 'drivers.read_car' )

Trong đó obj là một cá thể Người dùng hoặc Nhóm. Tôi nghĩ đơn giản hơn là viết một hàm cho điều 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

Trong đó thực thể là đối tượng để kiểm tra quyền đối với (Nhóm hoặc Người dùng), mô hình là phiên bản của mô hình, perms là danh sách các quyền dưới dạng chuỗi để kiểm tra (ví dụ: ['read', 'change']) và ứng dụng là tên ứng dụng dưới dạng một chuỗi. Để thực hiện kiểm tra tương tự như has_perm ở trên, bạn sẽ gọi một cái gì đó như sau:

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

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


27
Đây là một câu trả lời tuyệt vời cho các quyền, nhưng hầu như không liên quan đến các nhóm và cách chúng hoạt động trong Django?
NotSimon

4
Không có nhiều thứ 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 cấp quyền cho một Nhóm và quyền đó mở rộng cho tất cả các thành viên của nhóm đó. Tài liệu nói lên tất cả thực sự: docs.djangoproject.com/en/dev/topics/auth/default/#groups .
Alex Kuhl,

1
Tôi cảm thấy bắt buộc phải chỉ ra ở đây rằng bạn muốn xem xét sử dụng người giám hộ django cho việc này. Xem phân tích gói ủy quyền tại đây. Ngoài ra liên kết SOF này cung cấp một so sánh tốt đẹp.
Jeff Sheffield

1
Khi tôi bắt gặp điều này và cần sự cho phép của đối tượng, tôi đã tìm thấy django-Guardian: django-guardian.readthedocs.org/en/v1.2
dArignac

1
'Viết của riêng bạn' là xuống. Hay gì đó. Bây giờ nó bằng tiếng Trung.
William Karlsson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.