Как использовать аутентификацию в приложении Django
В моем Django приложении у меня есть модель PetOwner
со следующими полями: first_name
, last_name
, email
, phone_number
, address
.
Я хочу создать систему аутентификации для моего users
, который на данный момент является PetOwner
. Я подумал, что мне следует расширить систему из django.contrib.auth.models
или, более конкретно,
from django.contrib.auth.models import User
Я планировал иметь OneToOneField
в моей модели PetOwner
для ссылки на User
. Что-то вроде следующего...
user = models.OneToOneField(User, on_delete=models.CASCADE)
Я не уверен, что это имеет смысл делать. Также я не хочу, чтобы мой PetOwner
имел доступ к привилегиям admin
. Я привык к другим фреймворкам, таким как Flask
или NodeJS
, где мне придется hash
вводить пароль и hashed_password
сохранять его в пользователе document
или row
в зависимости от того, использую ли я sql
или nosql
.
Я хочу убедиться, что когда я ссылаюсь на пользователя, я ссылаюсь на PetOwner
.
У меня была идея добавить...
user = models.OneToOneField(User, on_delete=models.CASCADE)
В качестве поля в моей таблице PetOwner
я могу проверить, является ли этот пользователь PetOwner
Я могу убедиться, что даю этому пользователю только определенные привилегии, которые затем в моих представлениях, требующих аутентификации, где пользователь должен быть PetOwner
для доступа, должны быть PetOwner
и тому подобное. Однако, из документации django я использую следующее...
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
Затем я делаю что-то вроде этого, чтобы защитить свой взгляд...
class PetOwnerListView(LoginRequiredMixin, generic.ListView):
model = PetOwner
и в функциональных представлениях я делаю следующее...
@login_required
def index(request):
num_pet_owners = PetOwner.objects.all().count()
num_pets = Pet.objects.all().count()
num_breeds = Breed.objects.all().count()
num_addresses = Address.objects.all().count()
context = {
"num_pet_owners": num_pet_owners,
"num_pets": num_pets,
"num_breeds": num_breeds,
"num_addresses": num_addresses,
}
return render(request, "index.html", context=context)
Мои представления на основе классов не закончены, и мне нужно добавить некоторый код, который будет отображать, например, только всех питомцев текущего вошедшего пользователя. Достаточно ли мне добавить поле user = models.OneToOneField(User, on_delete=models.CASCADE)
в PetOwner
, а поле @login_required
или LoginRequiredMixin
даст мне доступ к текущему пользователю, и я смогу получить доступ ко всем разрешениям, которые у него могут быть или нет?
Если вы используете DRF, вы можете использовать его права доступа. Прежде всего, пользователь, который является персоналом, может получить доступ к странице администратора, так что не беспокойтесь об этом. Вы можете иметь поле OneToOne для пользователя, как вы сказали, и для каждого владельца питомца должен быть создан пользователь, который не является персоналом.
тогда вам нужно добавить новое разрешение, чтобы проверить, является ли пользователь, отправляющий запрос, также владельцем питомца или нет, как показано ниже
from rest_framework.permissions import BasePermission
class IsPetOwner(BasePermission):
def has_permission(self, request, view):
"""
:type request: rest_framework.request.Request
"""
if isinstance(request.user, AnonymousUser):
return False
else:
return PetOwner.objects.filter(user=request.user).exists()
и в вашем представлении вы должны установить разрешение следующим образом:
Class PetOwnerListView(ListAPIView):
permission_classes = [IsAuthenticated, IsPetOwner]