Django:每个实例的权限

Posted

技术标签:

【中文标题】Django:每个实例的权限【英文标题】:Django: Permission per instance 【发布时间】:2018-08-13 01:02:39 【问题描述】:

目前,我计划编写一个用户可以写博客文章的网站。我还没有开始实施,因为我是 Django 新手,想大致了解我应该如何解决问题和构建整个项目。

我的问题: 不允许用户使用 Django 的管理页面 (/admin)。用户应该只与我编写的网站互动。

我网站上的用户将能够创建博客文章。现在,我必须确保只有博文的创建者才能编辑/删除他自己的博文。所有其他用户应该只能阅读这篇文章。

所以,我需要每个用户/实例的权限。我知道有一些成熟的权限系统,比如 django-guardian,但我更愿意自己解决它。也是为了更好地理解 Django 框架。

我已经阅读了 Django 文档,但不知所措。

我想这是一个常见的问题,我也有一个通用的解决方案来解决这个问题。有人可以帮我看看我应该从哪里开始,从哪里开始?

到目前为止我的想法(请发表评论):

创建一个类似blog/5/edit 的页面,该页面仅供创建博客帖子编号5 的用户访问。这应该很容易在视图函数中,对吧?在这个页面上有一个表单来编辑博客文章。

类似这样的视图(伪代码!)

if request.user != blogpost.user:
    redirect/error page
else:
    show Form/process Form

这安全吗?到目前为止,我在搜索互联网时还没有找到这样的解决方案。然而,作为一个 Django 初学者,我自发地认为这已经足够了。

【问题讨论】:

是的,没问题。 您可以将装饰器用于“您的想法”,然后您可以将装饰器应用于您需要权限的视图函数。您可以看到相同 docs.djangoproject.com/en/2.0/_modules/django/contrib/auth/… 的现有装饰器实现 【参考方案1】:

是的,你可以这样做。为此,我建议创建一个自定义装饰器,如下所示:

decorators.py:

from django.core.exceptions import PermissionDenied
from .models import YourBlogPostModel

def user_is_blog_post_user(function):
    def wrap(request, *args, **kwargs):
        post = YourBlogPostModel.objects.get(pk=kwargs['blog_post_id'])
        if post.user == request.user:
            return function(request, *args, **kwargs)
        else:
            raise PermissionDenied
    wrap.__doc__ = function.__doc__
    wrap.__name__ = function.__name__
    return wrap

然后您可以将它与其他装饰器结合使用。

views.py:

@login_required
@user_is_blog_post_user
def function_based_view(request, blog_post_id):
    # ...

查看here以获得更详细的说明。


如果您使用CVB,您可以创建自己的Mixin 或decorate the class。

class UserIsBlogPostAdmin(object):
     """Verify that the current user is the user of the blog post."""
     def dispatch(self, request, *args, **kwargs):
         blog_post = get_object_or_404(YourBlogPostModel, pk=args[0])
         if blog_post.user != request.user
             raise Http404
         return super().dispatch(request, *args, **kwargs)

【讨论】:

谢谢!使用 django-guardian 或其他第三方应用程序是多余的。 :)

以上是关于Django:每个实例的权限的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 Django 权限以特定于某个模型的实例?

使用 Django 和 django-guardian 对象权限的每个对象的组

您自己的用户模型的 Django 每个对象权限

Django REST Framework - 每个方法的单独权限

Django-权限管理

谁有django流程权限控制这块的资料么