Django DRF 创建相关对象的权限

2023-11-29

我努力在 Django REST 框架中强制执行对象创建的安全性。

基本上,我可以使用“has_object_permission”在对象级别强制执行安全性:登录的用户必须是对象的所有者才能操作它。 实际上,正如文档中所述,我缩小了查询集中的对象检索范围,因此,我得到了 404 而不是 403。 我认为这不是问题(更好,因为它隐藏了对象的存在)

但我没有成功地禁止另一个用户创建相关对象......

我使用 ModelSerializer 和 ModelViewSet。

这里有一些天真的片段:

模型.py:

class Daddy(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Kiddy(models.Model):
    title = models.CharField(max_length=12)
    daddy = models.foreignKey(Daddy, on_delete=models.CASCADE)

序列化器.py:

class KiddySerializer(serializers.ModelSerializer):
    class Meta:
        model = Kiddy
        fields = '__all__'

视图集.py:

class KiddyViewSet(viewsets.ModelViewSet):
    serializer_class = KiddySerializer
    queryset = User.objects.none()

    permission_classes = (IsAuthenticated, IsOwner, )

    def get_queryset(self):
        dad_uuid = self.kwargs['dad']
        return Kiddy.objects.filter(daddy__pk=dad_uuid).filter(daddy__owner=self.request.user)

路由器.py:

router = routers.DefaultRouter()
router.register(r'dad', KiddyViewSet, base_name='kid')

网址.py:

path('api/<uuid:cv>/', include(router.urls))

使用这些 url 访问对象:http://.../api/4ecdddcdd-1c0a-4d0b-8254-b0c0d2607e6d/---> 列出所有孩子

http://.../api/4ecdddcdd-1c0a-4d0b-8254-b0c0d2607e6d/1---> 对象孩子

实际上,我得到了一些安全性,因为我使用 uuid,这很难猜测......

权限.py:

class IsOwner(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `owner` attribute.
"""

def has_object_permission(self, request, view, obj):
    if request.user != obj.daddy.owner:
        return False
    else:
        return True

如果使用错误的所有者登录,我可以创建相关的 Kiddy 对象!

我想,我必须以“has_permission”类型实现此权限。 但我不知道如何访问其中的对象,因为参数是请求和视图......

在这里,他找到了解决办法。但这根本不是通用的,因为我需要每个相关对象的自定义权限......而且我有很多!检查 Django REST Framework 中相关对象的权限

任何想法?


好的,我解决了这个问题:-)

在 requests.py 中,正如我怀疑的那样,我添加了这个 'has_permission' :

class IsOwnerParent(permissions.BasePermission):
    def has_permission(self, request, view):
        daddy = Daddy.objects.get(pk=view.kwargs['dad'])
        return daddy.owner == request.user

并将其添加到我的 ModelViewSet 类中:

class KiddyViewSet(viewsets.ModelViewSet):
    serializer_class = KiddySerializer
    queryset = User.objects.none()

    permission_classes = (IsAuthenticated, IsOwner, IsOwnerParent)

    def get_queryset(self):
        dad_uuid = self.kwargs['dad']
        return Kiddy.objects.filter(daddy__pk=dad_uuid).filter(daddy__owner=self.request.user)

所以,实际上这里提供的解决方案检查 Django REST Framework 中相关对象的权限做了工作。它实际上非常通用,因为我的许多对象都与“爸爸”对象相关。

实际上,现在检索对象列表的行为看起来更“正常”:我收到 403 错误而不是 404。

我认为这个用例很常见:用户只能创建与他们拥有的对象相关的对象,并且他们也只能更新和删除他们拥有的对象。

但也许可以用更好的方法来做?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django DRF 创建相关对象的权限 的相关文章

  • Django 星级评定系统和 AJAX

    我正在尝试在 Django 网站上实现星级评级系统 在我的模型中存储评级是排序的 就像在页面上显示分数一样 但我希望用户能够对页面进行评分 基本上从 1 到 5 而无需刷新或更改页面 我发现了以下内容 并且喜欢这里明星的风格 http jv
  • Django + WSGI:刷新问题?

    我正在开发一个 Django 网站 我在实时服务器上进行所有更改 只是因为这样更容易 问题是 它似乎时不时地喜欢缓存我正在处理的 py 文件之一 有时 如果我频繁点击刷新 它会在页面的旧版本和新版本之间来回切换 我的设置或多或少类似于 Dj
  • 如何将两个django模型(表)合并为一个模型(表)

    我想合并两个 django 模型并创建单个模型 我们假设 我有第一个表表 A 其中包含一些列和数据 Table A col1 col2 col3 col4 x1 x2 x3 x4 y1 y2 y3 y4 我还有另一个表 Table B 其中
  • Django的注释框架和CSRF

    据我了解 Django的评论框架 https docs djangoproject com en 1 4 ref contrib comments 专为匿名公众评论而设计 就像您通常在博客或文章下面看到的那样 换句话说 任何人都可以发表评论
  • 使用 Django ModelForm 上传个人资料图片

    我环顾过相关问题 但似乎没有一个答案有效 我正在尝试上传用户的个人资料图像并让它替换 覆盖 当前图像 保存图像后 我想将文件名更改为用户 ID 图像将以当前形式上传 但不会替换现有图像 例如 它将保存为 2 1 png class Phot
  • Django 管理员 - 登录

    我正在建造一个Django Web App 与 Django Suit 用于管理界面 已经让 Python 2 7 Django 1 10 和 MySQL 和谐通信并启动了一个项目 python m django admin startpr
  • 本地 React 前端、Django REST Framework 后端(在 CORS 下访问 CSRF cookie 时出现问题)

    我正在创建一个带有 React 前端和 Django REST Framework 后端的 Web 应用程序 由于某些情况 我必须在本地开发 React 前端 而后端服务器位于远程位置 后端服务器要求我在登录后的每个 POST 中使用 CS
  • Django GraphQL JWT:tokenAuth 突变返回“str 对象没有属性解码”

    目前 我正在文档页面中运行 django graphqljwt 的基本示例 https django graphql jwt domake io en latest quickstart html https django graphql
  • 如何为 bcrypt.hashpw 设置盐?

    salt yhnqazolr123098765 password bcrypt hashpw password salt repeatpassword bcrypt hashpw repeatpassword salt 我在第二行遇到错误
  • 使用 Django REST 框架进行 SAML SSO 身份验证

    我目前正在开发 AngularJS 前端和 Django REST 后端 我一直在使用Django rest auth https github com Tivix django rest auth过去需要对两者之间的连接进行身份验证 但现
  • Django 在 TabularInline 视图中禁用编辑(但允许添加)

    我想禁用编辑特定 TabularInline 实例中的所有对象 同时仍然允许添加并仍然允许编辑父模型 我有这个简单的设置 class SuperviseeAdmin admin TabularInline model Supervisee
  • Django REST Framework URL 与 Django 2.0

    我正在尝试使用 Django 2 0 项目设置 Django REST Framework 这意味着url r something 已替换为path something 我正在尝试弄清楚如何设置我的rest framework模式 这就是我
  • 在 Django 中翻译文件时的 Git 命令

    我在 Django 中有一个现有的应用程序 我想在页面上添加翻译 在页面上我有 trans Projects 在 po 文件中我添加了 templates staff site html 200 msgid Projects msgid P
  • 在 django admin 中自定义选择

    我有一个模型 其中一个字段是外键 所以我在 django admin 中看到选择 是否可以自定义此选择的标签 class Model models Model name models CharField def unicode self r
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • Serializers.StringRelatedField 的读/写等效项是什么?

    在 Django Rest Framework 3 中 我想返回 pk 关系的 unicode 值 就像使用 serializer StringRelatedField 一样 但我也需要该值可写 StringRelatedField 是只读
  • 存储过程和权限 - EXECUTE 就足够了吗?

    我有一个 SQL Server 2008 数据库 其中对基础表的所有访问都是通过存储过程完成的 一些存储过程只是从表中选择记录 而其他存储过程则进行 UPDATE INSERT 和 DELETE 如果存储过程更新表 执行存储过程的用户是否也
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 如何让 Django 和 ReactJS 协同工作?

    New to Django and even newer to ReactJS I have been looking into AngularJS and ReactJS but decided on ReactJS It seemed

随机推荐