使用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'),
...
]
希望这能解决您的问题:)
我正在使用 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'),
...
]
希望这能解决您的问题:)