【问题标题】:Better to use 3rd Party Row-Level Permission App or to Filter Query Results in a Django View?更好地使用第 3 方行级权限应用程序或在 Django 视图中过滤查询结果?
【发布时间】:2012-11-09 15:39:07
【问题描述】:

我正在编写一个涉及创建文档的 Django 应用程序。我有几个要求:

  1. 检查用户是否能够查看任何文档。
  2. 如果允许用户查看文档,则只允许他们查看他们有权查看的文档。

我想出了两种解决方案,我想知道一个在哲学/实践上是否比另一个更好。

我想出的两个解决方案是:

解决方案一(使用第三方 Django-Guardian)

Models.py

class Document(models.Model)
    owner = models.ForeignKey(User)
    document_name = models.CharField(max_length=60)
    document_content = models.TextField()

    class Meta:
    permissions = (
        ('view_document', 'View Document'),
    )

views.py

@permission_required('document.view_document', (Document, 'pk', 'document_id'))
def view_document(request, document_id):
    document = Document.objects.get(pk=document_id)
    return render_to_response("native/view_events.html",
    {
        'document' : document,
    }, context_instance=RequestContext(request))

我看到的第一个解决方案的缺点是,我必须在每次创建对象时显式设置权限,而且我必须访问数据库两次:一次是检查权限,另一次是检索文档对象。

解决方案二(使用内置 Django 权限)

Models.py

class Document(models.Model)
    owner = models.ForeignKey(User)
    document_name = models.CharField(max_length=60)
    document_content = models.TextField()
    viewers = models.ManyToManyField(User)

    class Meta:
    permissions = (
        ('view_document', 'View Document'),
    )

views.py

@permission_required('document.view_document')
def view_document(request, document_id):
    document = Document.objects.filter(pk=document_id, viewers__pk=request.user.pk)[0]
    return render_to_response("native/view_events.html",
    {
        'document' : document,
    }, context_instance=RequestContext(request))

我看到第一个解决方案的缺点是我必须进行两项检查,一项是查看他们是否能够查看文档,另一项是查看他们是否可以查看特定文档。这样做的好处是,如果我有一个管理员希望能够查看所有文档,我不需要明确授予每个文档的权限;我可以给他“查看文档”的权限。

似乎这两种解决方案各有利弊。有没有理论/实践更好的?

【问题讨论】:

    标签: django permissions django-permissions django-guardian


    【解决方案1】:

    我发现第二种方法更好。因为,您可以检查对象的模型级别权限。虽然在第一个我猜,你应该能够完成类似的事情。我不确定,但如果 django-guardian 提供了一种方法来检查视图代码而不是装饰器中的权限。您可以手动检查模型级别权限。 例如,

    def view_doc(request, doc_id):
          if user can not view doc: #Model Level Permission
                  return HttpResponse("Sorry can not view")
          if check django-guardian permission #Object Level Permission
                   return HttpResponse("Can not view doc")
          #further code
    

    但我建议使用第二种方法,因为您可以创建一个 api 来检查权限并对其进行自定义,使其更具可扩展性。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2016-02-03
      • 1970-01-01
      • 2013-02-07
      • 2011-03-20
      • 2017-02-08
      • 2021-11-10
      • 1970-01-01
      • 2020-03-20
      相关资源
      最近更新 更多