2012-01-21 28 views
6

Làm cách nào để đảm bảo rằng Người dùng chỉ có thể chỉnh sửa các đối tượng mà họ đã tạo? Cách tốt nhất để thiết lập điều này là gì?quyền đối tượng cấp django

Tôi đang sử dụng django-rest-framework và tự hỏi liệu có cách nào để hạn chế người dùng xem/chỉnh sửa các đối tượng mà họ không 'sở hữu' hay không.

class Video(models.Model): 
    owner = models.ForeignKey(User) 
    ... 

Vì vậy, người dùng 'x' chỉ có thể chỉnh sửa video trong owner_set của họ.

+0

Làm thế nào để bạn xác định người sử dụng "quyền sở hữu" của một đối tượng? Vui lòng bao gồm đủ các mô hình của bạn để chúng tôi có thể xem bạn đang nói về điều gì. –

+0

@ S.Lott vừa cập nhật để bao gồm điều này. –

Trả lời

2

Có lẽ bạn đã bật phiên và mô hình auth.

Bạn phải chắc chắn rằng tất cả lượt xem (REST và không phải REST) ​​yêu cầu xác thực.

Đối với không phải REST, thật dễ dàng. Bạn chỉ cần sử dụng một trang trí cơ bản @login-required ở khắp mọi nơi.

Đối với khung Django-REST, hãy đọc: http://django-rest-framework.org/library/authentication.html#module-authentication.

Bạn phải sử dụng hỗn hợp xác thực để đảm bảo rằng xác thực thực sự xảy ra.

Khuôn khổ hỗ trợ Xác thực BASIC, yêu cầu kết nối SSL để bảo mật. Việc triển khai xác thực DIGEST không quá khó khăn, điều này không yêu cầu SSL.

Tránh phiên. Nó vi phạm nguyên tắc REST để đăng nhập và đăng xuất. Khung này hỗ trợ các phiên, nhưng nó ít hơn lý tưởng.

Khi bạn đã xác thực tất cả các yêu cầu, bạn sẽ biết người dùng.

Nếu bạn biết người dùng, thì user.video_set sẽ hoạt động hoàn hảo. Bạn cũng có thể sử dụng Video.objects.filter(...) để đảm bảo rằng bạn đang truy vấn người dùng, nhưng dễ dàng hơn để xác nhận mã là chính xác nếu bạn làm việc với user.video_set.get(...) hoặc user.video_set.filter() hoặc bất kỳ điều gì.

Tất cả kiểm tra ủy quyền có liên quan được thực hiện trong Chế độ xem. Bạn đang cung cấp Chế độ xem cho ModelResources của mình.

Đây là "chế độ xem dựa trên lớp học". Tài liệu có tại đây: https://docs.djangoproject.com/en/dev/topics/class-based-views/#viewing-subsets-of-objects

Bí quyết là chọn tất cả các bộ trộn và serializers phù hợp.

Ví dụ, bạn có thể trộn được chế biến theo cách này:

http://django-rest-framework.org/howto/mixin.html

Bạn sẽ thực hiện bộ lọc vào get phương pháp

+1

Cảm ơn bạn rất nhiều vì câu trả lời kỹ lưỡng! Tôi vẫn tự hỏi nơi thích hợp là đặt mã mà bộ lọc dựa trên người dùng? Tôi mới bắt đầu sử dụng Django-REST và đang gặp khó khăn trong việc tìm ra điều đó ... –

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