如何限制用户访问以查看/修改其他用户使用Django创建的对象

时间:2018-02-22 20:36:46

标签: python django

我正在与Django一起制作一个爱好项目来存储我的想法,如下所示:

class Idea(models.Model):
    name = models.CharField(unique=True, max_length=50)
    description = models.TextField()
    in_process = models.BooleanField()
    is_done = models.BooleanField()
    group = models.ForeignKey(Group, on_delete=models.CASCADE, blank=False)


class Group(models.Model):
    name = models.CharField(unique=True, max_length=25)
    description = models.CharField(max_length=50, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=False)

有没有办法限制当前登录的用户能够查看或修改其他用户使用基于通用类的视图创建的构思和构思组吗?

class GroupDelete(LoginRequiredMixin, generic.DeleteView):
    model = Group
    pk_url_kwarg = "id"
    success_url = reverse_lazy('ideas:list')

...和一个网址例如:

urlpatterns = [
    path('<int:id>/delete', views.GroupDelete.as_view(), name='delete'),
]

我正在使用Django 2.0。

1 个答案:

答案 0 :(得分:1)

我建议您在继承LoginRequiredMixin的位置编写自定义mixin,然后添加自己的逻辑,验证当前登录的用户(可以从request.user审核)是实际创建Group对象的人。

简单的例子看起来像这样:

# mixins.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseNotFound, HttpResponseRedirect


class YourCustomMixin(LoginRequiredMixin):
    def dispatch(self, request, *args, **kwargs):
        can_access = ... logic to check if user can access Group ...

        disp = super().dispatch(request, *args, **kwargs)
        if not isinstance(disp, HttpResponseRedirect) and not can_access:
            return HttpResponseNotFound()
        return disp

获得can_access标记的值后,调用LoginRequiredMixin的{​​{1}}方法并检查该调用的结果是否为重定向(到登录页面)并检查dispatch标记,然后返回can_access或原始HttpResponseNotFound()结果。

当然,您也可以返回disp而不是HttpResponseForbidden()

然后,您可以在视图中使用它,例如:

HttpResponseNotFound()