gpt4 book ai didi

python - DRF - 如何使用 Oauth Toolkit 验证应用程序?

转载 作者:太空宇宙 更新时间:2023-11-03 11:18:17 25 4
gpt4 key购买 nike

在我的应用程序中,我使用修改后的 User 模型,其中包含我需要的另外 3 个字段。

from django.contrib.auth.models import AbstractUser
from django.db import models

import ldapdb.models


class User(AbstractUser):
cotisant = models.BooleanField(default=False)
nbSessions = models.IntegerField(default=0)
tel = models.CharField(max_length=20, default="")

我希望人们能够更改他们的帐户设置,(例如他们的密码、电子邮件、电话,...)。

为此,我有一个像这样的序列化程序:

from rest_framework import serializers
from django.contrib.auth.hashers import make_password
from coreapp.models import User


class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password', 'cotisant', 'tel')
extra_kwargs = {
# Allow to set pwd, but disallow getting the hash from database
'password': {'write_only': True}
}

def validate_password(self, value: str):
return make_password(value)

像这样的 View :

class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
permission_classes = (IsSelfOrStaffPermission, TokenHasReadWriteScopeOrCreate,)
lookup_field = 'username'

def get_queryset(self):
current_user = self.request.user
if current_user.is_staff:
user_set = User.objects.all()
else:
user_set = User.objects.filter(username=current_user.username)

query = self.request.query_params.get('q', None)

if not query:
return user_set

return user_set.filter(
Q(username__icontains=query) |
Q(first_name__icontains=query) |
Q(last_name__icontains=query)
)

(这只允许用户访问他自己,除非他是员工)

问题是,要更新 nbSessions 参数,用户必须在我的一个应用程序上支付一些费用。

如何允许应用设置参数,但不允许用户直接更新?

注意:我还有其他使用密码凭证流的应用程序并且是客户端,因此有人可以通过它获取应用程序 token 。

最佳答案

如果我对问题的理解正确,您希望特定字段 (nbSessions) 可由某些第三方应用通过相同的 API 端点写入,但普通用户不可写入。

我会这样做:创建两个不同的序列化器,一个用于第三方应用,另一个用于普通用户。

class UserSerializer(serializers.ModelSerializer):
"""
Serializer used by third-party apps.
All fields, including nbSessions, are writeable.
"""

class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password', 'cotisant', 'nbSessions', 'tel')
extra_kwargs = {
'password': {'write_only': True}
}

# ...

class RestrictedUserSerializer(UserSerializer):
"""
Serializer used by regular users.
All fields except nbSessions are writeable.
It inherits from UserSerializer so that common code is not duplicated.
"""

class Meta(BaseUserSerializer.Meta):
read_only_fields = ('nbSessions',)

在这里,如您所见,两个序列化程序之间的唯一区别是 RestrictedUserSerializer.Meta 中存在 read_only_fields 属性。

然后在您的 View 中,您可以检查您的请求以查看要使用的序列化程序类:

class UserViewSet(viewsets.ModelViewSet):

def get_serializer_class(self):
if is_third_party_app(self.request.user):
return UserSerializer
return RestrictedUserSerializer

# ...

您可以进一步扩展此概念,并为普通用户、第三方应用程序、员工、管理员等提供不同的序列化程序类(可能继承自同一基类)。每个序列化程序都可以有其特定的字段集、验证规则和更新逻辑。

关于python - DRF - 如何使用 Oauth Toolkit 验证应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com