У меня есть сложный набор разрешений, которые я хочу применить к своим представлениям, но мне трудно понять, где их разместить. Вот мои основные c разрешения.
Список всех проектов:
- Если пользователь является владельцем и его учетная запись активна
- Или если они суперпользователь
- И объект не является частным для другого пользователя
- Или они являются членами назначенной группы
Проблема заключается в том, что когда я добавляю этот лог c для классов разрешений ModelApiViewset, он возвращает каждый проект. Как заставить его отображать только те из них, которые соответствуют вышеуказанным критериям?
Чтобы проиллюстрировать этот пример, у меня есть 2 аккаунта: мой суперпользователь и test_user. test_user не является учетной записью администратора или персонала и не входит в группу менеджеров. Учетная запись test_user является владельцем проекта 2, но не проекта 1. Но если я использую учетные данные test_user, я вижу оба проекта 1 и 2:
[
{
"id": 1,
"name": "Test Private Project",
"slug": "test-private-project",
"description": "Just testing the super private project",
"group": {
"name": "manager",
"id": 1
},
"created_date": "2020-04-20T18:04:20.666564Z",
"modified_date": "2020-04-20T18:04:20.666594Z",
"owner": {
"username": "admin",
"full_name_display": "Administrator",
"photo": null,
"is_active": true,
"id": 1
},
"is_private": true
},
{
"id": 2,
"name": "Test User Project",
"slug": "test-user-project",
"description": "Test project for users",
"group": {
"name": "Users",
"id": 2
},
"created_date": "2020-04-20T20:10:02.068390Z",
"modified_date": "2020-04-20T20:10:02.068429Z",
"owner": {
"username": "test_user",
"full_name_display": "Test User",
"photo": null,
"is_active": true,
"id": 2
},
"is_private": false
}
]
Test_user не должен видеть проект 1, потому что они не владелец, не администратор, и проект является частным для администратора.
просмотр:
class ProjectListViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
authentication_classes = [TokenAuthentication, ]
permission_classes = [IsOwner, IsActive, IsPrivatelyOwned]
права доступа:
class IsOwner(BasePermission):
def has_object_permission(self, request, view, obj):
return obj.owner == request.user
class IsActive(BasePermission):
def has_object_permission(self, request, view, obj):
return request.user.is_active
class IsPrivatelyOwned(BasePermission):
def has_object_permission(self, request, view, obj):
if obj.is_private:
if obj.owner == request.user:
return True
return False
return True
Я знаю, что я ' Я пропускаю что-то довольно простое здесь, но я не могу понять это. Любая помощь будет принята с благодарностью. Заранее спасибо.