2012-11-09 4 views
2

문서 생성과 관련된 Django 앱을 작성 중입니다. 사용자가 전혀 어떤 문서를 볼 수 있는지 확인하기 위해제 3 자 행 수준 권한 응용 프로그램을 사용하거나 장고보기에서 쿼리 결과를 필터링하는 것이 더 낫습니까?

  1. 확인 : 나는 몇 가지 요구 사항이 있습니다.
  2. 사용자가 문서를 볼 수 있으면 권한이있는 문서 만 볼 수 있도록 허용합니다.

나는 두 가지 해결책을 생각해 냈으며, 하나의 철학적/실제적으로 다른 것보다 나은지 궁금해하고 있습니다.

내가 함께 왔어요 두 솔루션

은 다음과 같습니다

해결 한 (사용하여 타사 장고 - 가디언)

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 (장고 권한 내장 사용)

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)) 

내가 솔루션 번호 하나에 볼 수있는 단점은 내가해야한다는 것입니다 2 개의 수표, 하나는 문서를 전혀 볼 수 있는지, 다른 하나는 p를 볼 수 있는지 확인하는 것입니다. 관절 문서. 장점은 모든 문서를 볼 수있는 관리자가 있으면 각 문서에 대한 권한을 명시 적으로 부여 할 필요가 없다는 것입니다. 나는 그에게 'view document'권한을 줄 수있다.

두 솔루션 모두 장단점이있는 것으로 보입니다. 이론/실천면에서 더 나은 점이 있습니까?

답변

0

두 번째 방법이 더 좋습니다. 이후로 개체에 대한 모델 수준 권한을 확인할 수 있습니다. 처음에는 비슷한 일을 성취 할 수 있어야합니다. 장고 보호자가 데코레이터 대신보기 코드 내에서 사용 권한을 확인할 수있는 방법을 제공하는지 잘 모르겠습니다. 모델 수준 권한을 수동으로 확인할 수 있습니다. 예를 들어 ,

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를 만들 수 있기 때문에 두 번째 방법을 제안한다.