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