【问题标题】:How to allow user to modify only his data in Django Rest Framework如何允许用户在 Django Rest Framework 中只修改他的数据
【发布时间】:2019-04-03 02:30:19
【问题描述】:

我正在使用 Django 2.1.8 构建简单的 API,并使用 Django OAuth Toolkit 提供安全性。我已经达到了用户只能在授权后使用 api 的地步,但我想将他的操作限制在他的数据上。

我已经使用 oauth2 建立了授权,它返回给我访问令牌

models.py

class Client(AbstractUser):

    email = models.EmailField(
        verbose_name='email adress',
        max_length= 255,
        unique=True,
    )
    location = models.CharField(max_length=500, default="")

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    objects = ClientManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['location']

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

views.py

class SingleClientView(generics.RetrieveAPIView):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer
    permission_classes = [IsAuthenticated, TokenHasReadWriteScope]

是否有可能将返回的令牌与用户模型连接起来,所以每次有人使用 API 时,它都会过滤用户是否匹配所需的数据?或者oauth工具包是否自动以及如何访问它?

【问题讨论】:

    标签: python django oauth-2.0 django-rest-framework django-oauth


    【解决方案1】:

    您必须在settings.py 文件的中间件中添加oauth2_provider.middleware.OAuth2TokenMiddleware。这将自动为用户附加令牌所属的请求,您可以从request 访问它,如request.user

    您可以相应地修改您的视图。

    class SingleClientView(generics.RetrieveAPIView):
        queryset = Client.objects.all()
        serializer_class = ClientSerializer
        permission_classes = [IsAuthenticated, TokenHasReadWriteScope]
    
        def get_object(self):
            return self.request.user
            # or any similar logic here..
    

    【讨论】:

    • 我已经完成了,每当我尝试访问 request.user 时,它都会给我:Client object has no attribute get。在我的自定义客户端模型中应该如何看待 get 方法?
    • 看起来您正在调用 Client 对象的 get 方法。你能发布你正在尝试的(代码)吗?
    • 我得到了 访问令牌,现在我正在尝试运行这个函数:def test(request): return request.user 看看它是否真的有效。我想这与 django/middleware/clickjacking.py 文件中的错误有关:if response.get('X-Frame-Options') is not None: return response
    • 它给了Client对象没有属性get
    • 您正在从 test 函数返回 return request.user。它不应该工作。你必须返回一个HttpResponse 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2020-08-30
    相关资源
    最近更新 更多