를 통과하지 않는 경우에 예외를 발생 :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
예외)를 발생시킬 수 있습니까?
예외를 발생시키기 위해 다른 데코레이터를 설정할 수있는 방법이 있습니까? 앞서 언급했듯이 데코레이터 개발에 너무 능숙하지는 않지만, 한 가지만 이해할 수 있다면 그렇게 할 수 있다고 생각합니다. 사용자가 'user_passes_test'로 어떻게 전달됩니까? 약간 마술처럼 보입니다. 데코레이터에서 요청 사용자를 가져 오는 방법을 알아낼 수 있다면 좋을 것입니다. – dabadaba
예외를 발생시키는 데코레이터를 작성할 수 있습니다. 'user_passes_test'에 대한 [소스 코드] (https://github.com/django/django/blob/4202ed243710926c3f059d848304145bd6b89225/django/contrib/auth/decorators.py#L10)를 보는 것이 좋은 출발점이 될 것입니다. 데코레이터에서 생성 된'_wrapped_view'는'request'를 첫 번째 인수로 취합니다. 그것은'request.user'를 사용하여 사용자에게 접근 할 수 있습니다. – Alasdair