Django中自定义构建装饰器的安全性问题

Kanchon Gharami

我正在使用Django中的自定义构建装饰器

我的decorators.py

from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test

def industry_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='app2:request_login'):
    actual_decorator = user_passes_test(
        lambda u: u.is_active and u.is_Industry,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if function:
        return actual_decorator(function)
    return actual_decorator

is_Industry是一个布尔值,来自models.py。

我的views.py

@method_decorator(industry_required, name='dispatch')
class industryDetails(DetailView):
    model = Industry
    template_name = 'app/industryDetails.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['inserted_text'] = "inserted text from EmployeeDetails of views.py"
        return context

urls.py中

path('industryDetails/<int:pk>/', views.industryDetails.as_view(), name='industryDetails')

如果需要,还包括models.py

class myCustomeUser(AbstractUser):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=20, unique="True", blank=False)
    password = models.CharField(max_length=20, blank=False)
    is_Employee = models.BooleanField(default=False)
    is_Inspector = models.BooleanField(default=False)
    is_Industry = models.BooleanField(default=False)
    is_Admin = models.BooleanField(default=False)


class Industry(models.Model):
    user = models.OneToOneField(myCustomeUser, on_delete=models.CASCADE, primary_key=True, related_name='industry_releted_user')
    name = models.CharField(max_length=200, blank=True)
    owner = models.CharField(max_length=200, blank=True)
    license = models.IntegerField(null=True, unique=True)
    industry_extrafield = models.TextField(blank=True)

现在我的问题是,假设具有的用户primary_key=3可以primary_key=2通过使用http://127.0.0.1:8000/industryDetails/2/(通过更改此地址路径中的主键)轻松访问具有的其他用户的数据我需要停止这个项目。如何以任何用户只能访问自己的详细信息的方式对此进行编码?

威廉·范昂塞姆

这与装饰器本身无关,您只需要过滤阻止人们访问另一个装饰器Industry,所以:

@method_decorator(industry_required, name='dispatch')
class industryDetails(LoginRequiredMixin, DetailView):
    model = Industry
    template_name = 'app/industryDetails.html'

    def get_queryset(self):
        return Industry.objects.filter(user=self.request.user)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['inserted_text'] = "inserted text from EmployeeDetails of views.py"
        return context

由于每个用户都可以但是最多有一个 Industry,你也许应该添加主键的URL。因此,您可以定义如下路径:

path('industryDetails/', views.industryDetails.as_view(), name='industryDetails')

并在视图中覆盖该get_object方法:

from django.shortcuts import get_object_or_404

@method_decorator(industry_required, name='dispatch')
class industryDetails(LoginRequiredMixin, DetailView):
    model = Industry
    template_name = 'app/industryDetails.html'

    def get_object(self):
        return get_object_or_404(Industry, user=self.request.user)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['inserted_text'] = "inserted text from EmployeeDetails of views.py"
        return context

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django中自定义构建装饰器的条件设置问题

来自分类Dev

如何在Django中制作自定义装饰器?

来自分类Dev

TypeScript中的自定义装饰器

来自分类Dev

Tornado 中的自定义装饰器

来自分类Dev

制作自定义django视图装饰器(带有args)时遇到问题

来自分类Dev

Git安全性问题

来自分类Dev

“ wget”的安全性问题

来自分类Dev

KDE和Gnome中的启动器安全性问题是否已解决?

来自分类Dev

菊花链式Python / Django自定义装饰器

来自分类Dev

Django自定义权限方法或装饰器

来自分类Dev

菊花链式Python / Django自定义装饰器

来自分类Dev

Django Rest框架中基于类的视图的自定义装饰器

来自分类Dev

Django Rest Framework 内部函数未在自定义装饰器中调用

来自分类Dev

node.js进程中jsRender的安全性问题

来自分类Dev

Brakeman提出的Rails中的安全性问题

来自分类Dev

Brakeman提出的Rails中的安全性问题

来自分类Dev

Nautilus 3.28.1中的大安全性问题

来自分类Dev

Jenkins的配置和安全性问题

来自分类Dev

websharper webgl演示安全性问题?

来自分类Dev

CreateProcess API的安全性问题

来自分类Dev

Bluemix Push服务安全性问题

来自分类Dev

元素级安全性问题

来自分类Dev

使用mongodb的安全性问题

来自分类Dev

启用telnet是安全性问题吗?

来自分类Dev

CreateProcess API的安全性问题

来自分类Dev

由于安全性问题而更新OpenWRT

来自分类Dev

Ubuntu OpenERP上的安全性问题

来自分类Dev

苗条的宁静API的安全性问题

来自分类Dev

密码恢复安全性问题