0

我正在使用 React(front)、Django(server-side)、Simple JWT for User Auth Model 和 Postgres DB。

让我解释一下我的模型:公司拥有许多财产,每个公司都有多个用户。当用户登录时,我希望他们看到属于他们自己公司的属性列表。当用户从列表中选择任何属性时,我需要再次检查用户是否具有权限,然后运行查询。我目前正在使用 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 令牌并检查属于哪个公司用户,相应地运行查询,然后发送成功消息以及过滤后的数据?

4

1 回答 1

0

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'),
    ...
]

希望这能解决你的问题:)

于 2021-01-24T04:49:42.907 回答