Используя Django, SimpleJWT проверяет разрешение пользователя на показ контента, принадлежащего его собственной компании.

Я использую React (спереди), Django (на стороне сервера), Simple JWT для модели аутентификации пользователя и БД Postgres.

Позвольте мне объяснить мою модель: компания владеет множеством свойств, и у каждой компании есть несколько пользователей. Когда пользователь входит в систему, я хочу, чтобы он видел список свойств, принадлежащих их собственной компании. Когда пользователь выбирает любое свойство из списка, мне нужно снова проверить, есть ли у пользователя разрешение, а затем выполнить запросы. В настоящее время я использую Simple JWT для аутентификации. Когда пользователь входит в систему, серверная часть генерирует токены доступа и обновления. С каждым запросом, отправленным со стороны пользователя, я отправляю токен доступа JWT. На стороне сервера я хочу декодировать токен, посмотреть, к какой компании принадлежит пользователь, соответствующим образом отфильтровать запросы и отправить JsonResponse.

Вот моя модель компании:

class Company(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='company_user', on_delete=models.CASCADE, null=True)
    company_name = models.CharField(max_length=200, null=True)
    slug = models.SlugField(max_length=200, unique=True)   

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

Вот модель свойства:

class Property(models.Model):
    company = models.ForeignKey(Company, related_name='prop_company', null = True, on_delete=models.CASCADE)
    property_name = models.CharField(max_length=200, null=True)
    property_type = models.CharField(max_length=200, null=True)
   

    def __str__(self):
        return self.property_name 

Вот данные о собственности

class PropertyData(models.Model):
    
    data = models.ForeignKey(Property, related_name='property_data', null = True, on_delete=models.CASCADE)
    lat = model.FloatField(null=True)
    long = model.FloatField(null=True)

Как мне обработать токен JWT в бэкэнде и проверить, к какой компании принадлежит пользователь, выполнить соответствующие запросы, а затем отправить сообщение об успешном завершении вместе с отфильтрованными данными?


person PandasasPD    schedule 24.01.2021    source источник


Ответы (1)


В simple-JWT вы можете настроить заявку на токен. Для этого добавьте это в свой файл serializer.py.

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)

        # Add custom claims
        token['company_name'] = user.company_user.company_name # will add requested user company name in token
        # ...

        return token

# your views.py
class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

а также не забудьте обновить файл urls.py.

from .views import CustomTokenObtainPairView


urlpatterns = [
    ...
    path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
    ...
]

Надеюсь, это решит вашу проблему :)

person Mubashar javed    schedule 24.01.2021
comment
Спасибо Мубашар! Это действительно помогло мне двигаться в правильном направлении. - person PandasasPD; 26.01.2021
comment
@Mubashar, вы отправили название компании с токеном, но вам все равно нужно проверить его прямо в представлении? В представлении нужно проверить, принадлежит ли компания тому пользователю, который делает запрос? - person Lobbel; 09.06.2021