使用Django,SimpleJWT检查用户权限显示属于自己公司的内容

Using Django, SimpleJWT checking User permission to show content belongs to his own company

我正在使用 React(前端)、Django(服务器端)、用于用户身份验证模型和 Postgres 数据库的简单 JWT。

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

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

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