2017-04-05 4 views
0

를 통과하지 않는 경우에 예외를 발생 :user_passes_test : 사용자가 나는 사용자가 관리자 특정 권한이 있는지 확인하기 위해 장식을 정의하기 위해 노력하고

def admin_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None): 
    actual_decorator = user_passes_test(
     lambda u: u.is_staff and u.is_authenticated() and not Association.objects.filter(admins=u).exists(), 
     login_url=login_url, 
     redirect_field_name=redirect_field_name 
    ) 
    if function: 
     return actual_decorator(function) 
    return actual_decorator 

목적이의 의견을 축복하는 사용하는 것입니다. 특히, 전 클래스 기반보기에서 사용하고 있습니다 :

class MyCBV(CreateView): 
    @method_decorator(admin_required) 
    def dispatch(self, request, *args, **kwargs): 
     return super(MyCBV, self).dispatch(request, *args, **kwargs) 

문제는 리디렉션이 발생하지 않도록이보기가, AJAX를 통해로드 된 것입니다. 또한 사용자 인증이 실패한 경우에도보기가 반환하는 HTTP 상태가 성공하므로 클라이언트 (JS)는 작업이 실제로 성공했는지 여부를 알릴 방법이 없습니다.

나는 데코레이터와 Django 인증을 이해하는 데 어려움이 있으므로 제 질문은 인증 장식 기능이 실패 할 때 예외 (바람직하게는 PermissionDenied 예외)를 발생시킬 수 있습니까?

답변

0

장고 1.9+에서는 장식 자 대신 UserPassesTestMixin을 사용하고 raise_exceptionTrue으로 설정할 수 있습니다.

불안정하고 오래된 Django 1.4를 사용하고 있으므로이 작업을 수행 할 수 없습니다. 리디렉션이 아닌 user_passes_testPermissionDenied으로 설정하는 옵션은 없습니다. 자바 스크립트에서 리디렉션을 감지하거나 user_passes_test 소스 코드를보고 원하는 응답을 반환하는 비슷한 것을 구현할 수 있습니다.

+0

예외를 발생시키기 위해 다른 데코레이터를 설정할 수있는 방법이 있습니까? 앞서 언급했듯이 데코레이터 개발에 너무 능숙하지는 않지만, 한 가지만 이해할 수 있다면 그렇게 할 수 있다고 생각합니다. 사용자가 'user_passes_test'로 어떻게 전달됩니까? 약간 마술처럼 보입니다. 데코레이터에서 요청 사용자를 가져 오는 방법을 알아낼 수 있다면 좋을 것입니다. – dabadaba

+0

예외를 발생시키는 데코레이터를 작성할 수 있습니다. 'user_passes_test'에 대한 [소스 코드] (https://github.com/django/django/blob/4202ed243710926c3f059d848304145bd6b89225/django/contrib/auth/decorators.py#L10)를 보는 것이 좋은 출발점이 될 것입니다. 데코레이터에서 생성 된'_wrapped_view'는'request'를 첫 번째 인수로 취합니다. 그것은'request.user'를 사용하여 사용자에게 접근 할 수 있습니다. – Alasdair