防止用户在u中键入slug时访问其他用户的数据

2024-09-29 23:27:16 发布

您现在位置:Python中文网/ 问答频道 /正文

如果用户1创建此票据: 我的网站/经理/票务/票证-来自用户-1/

用户2创建: 我的网站/经理/票务/票务-来自用户-2/

如何防止用户1通过在url中键入票据来阻止用户2或其他用户访问票据?在

views.py

class TicketDisplay(LoginRequiredMixin, DetailView):
    model = Ticket
    template_name = 'ticket_detail.html'
    context_object_name = 'ticket'
    slug_field = 'slug'

    def get_context_data(self, **kwargs):
        context = super(TicketDisplay, self).get_context_data(**kwargs)
        context['form_add_comment'] = CommentForm()
        return context

url.py

^{pr2}$

Tags: 用户namepyselfurldataget网站
2条回答

我最近在一个项目中实现了这个功能。这可以通过使用自动生成的uuid来完成。Django为此有a built-in model field,或者可以使用slug字段并给它一个默认值。下面是一个简单的例子。在

在你的模型.py文件,导入uuid库,然后将slug字段的默认值设置为uuid.uuid4. 在

在模型.py公司名称:

import uuid

class Ticket(models.Model):
    uuid = models.SlugField(default=uuid.uuid4, editable=False)
    ...

在网址.py,只需像pk一样使用uuid字段。像这样:

^{pr2}$

在“更新”和“删除”视图的详细信息中,需要确保并设置这两个属性,以便Django知道要将哪个字段用作slug:

slug_field = 'uuid'
slug_url_kwarg = 'uuid'

然后在你的模板中,当你需要为kwargs检索一个对象时,只需使用uuid而不是pk。在

请注意除此之外,您还应尽可能使用权限阻止用户查看其他页面。您可以阻止某些帐户查看其他人的详细信息。例如,您可以编写一个权限mixin来检查请求.用户与视图正在处理的对象匹配。在

假设你的用户有一种

class SameUserOnlyMixin(object):

    def has_permissions(self):
        # Assumes that your Ticket model has a foreign key called user.
        return self.get_object().user == self.request.user

    def dispatch(self, request, *args, **kwargs):
        if not self.has_permissions():
            raise Http404('You do not have permission.')
        return super(SameUserOnlyMixin, self).dispatch(
            request, *args, **kwargs)

最后,像这样把它贴在你的视图上:

class TicketDisplay(LoginRequiredMixin, SameUserOnlyMixin, DetailView):
    ...

你需要让用户1拥有用户2无法模仿的东西。在

首选的方法是使用现有的身份验证方法,并检查是否允许用户访问页面。在

如果您的站点没有注册,那么您可以生成一些随机字符串secret-并将其与问题一起存储。如果'user'有这个secret,那么他是被允许的。在

这个秘密字符串可以存储在cookie中,也可以作为URL的一部分。在

将其存储在cookie中有一个缺点:如果cookie丢失,则没有人可以访问该页面。用户也不能从其他浏览器访问它。在

将其作为url的一部分还有另一个缺点:如果其他人看到链接,他也可以访问该页面。如果用户的软件自动报告他访问过的某个地方,这可能会很糟糕。在

结合这些方法有两个缺点。在

相关问题 更多 >

    热门问题