Tôi đang sử dụng Khung công tác REST Django để truy cập tài nguyên 'người dùng'.Quyền đối tượng cấp khung đối tượng Django REST
Khi thông tin người dùng là cá nhân, tôi không muốn yêu cầu GET liệt kê mọi người dùng trên hệ thống, KHÔNG BAO GIỜ họ là quản trị viên.
Nếu người dùng chỉ định id của họ và họ đã đăng nhập, tôi muốn họ có thể xem chi tiết của họ và sửa đổi chúng (PUT POST DELETE) nếu được yêu cầu.
Tóm lại, không cho phép phương thức GET cho bất kỳ ai không phải là quản trị viên và cho phép GET POST DELETE PUT trên người dùng đã đăng nhập khi xem thông tin của họ.
vì vậy tôi tạo ra các lớp cho phép tùy chỉnh:
class UserPermissions(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_permission(self, request, view):
# if admin: True otherwise False
def has_object_permission(self, request, view, obj):
# if request.user is the same user that is contained within the obj then allow
này đã không làm việc. Sau khi một số gỡ lỗi tôi thấy rằng nó kiểm tra has_permission đầu tiên, THEN kiểm tra has_object_permission. Vì vậy, nếu chúng ta không vượt qua rào cản đầu tiên GET/user /, thì nó thậm chí sẽ không xem xét GET/user/id tiếp theo.
vậy Tóm lại, có ai biết tôi sẽ làm thế nào để làm việc này không?
Cảm ơn :)
EDIT:
Tôi đã sử dụng ModelViewSets, mà không có vấn đề này như tôi đã mô tả.
Nhưng nếu bạn chia các chức năng Danh sách với các chi tiết sau đó bạn có thể cung cấp cho họ các lớp học phép riêng biệt:
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes=(UserPermissionsAll,)
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes=(UserPermissionsObj,)
class UserPermissionsAll(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_permission(self, request, view):
if request.user.is_staff:
return True
else:
return False
class UserPermissionsObj(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
def has_object_permission(self, request, view, obj):
if request.user.is_staff:
return True
return obj == request.user
Giải pháp bên dưới từ Trình lập hóa chất sẽ hoạt động với 'bộ đếm '. – jfunk