2

ドキュメントの作成を伴う Django アプリを作成しています。いくつかの要件があります。

  1. ユーザーがドキュメントを表示できるかどうかを確認します。
  2. ユーザーがドキュメントの表示を許可されている場合は、権限のあるドキュメントの表示のみを許可します。

私は2つの解決策を考え出しましたが、一方が哲学的/実際的に優れているかどうか疑問に思っています.

私が思いついた2つの解決策は次のとおりです。

解決策 1 (サードパーティの 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))

解決策 1 の欠点は、オブジェクトを作成するたびにアクセス許可を明示的に設定する必要があることと、データベースに 2 回アクセスする必要があることです。

解決策 2 (組み込みの 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))

解決策 1 の欠点は、2 つのチェックを行う必要があることです。これのプラス面は、すべてのドキュメントを表示できるようにしたい管理者がいる場合、各ドキュメントに明示的に許可を与える必要がないことです。彼に「ドキュメントの表示」権限を与えるだけです。

どちらのソリューションにも長所と短所があるようです。理論/実践で優れているものはありますか?

4

1 に答える 1

0

2番目のアプローチの方が優れていると思います。そのため、オブジェクトのモデル レベルの権限を確認できます。最初は、同様のことを達成できるはずです。よくわかりませんが、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 を作成できるため、よりスケーラブルな 2 番目のアプローチをお勧めします。

于 2012-11-09T16:30:54.357 に答える