簡體   English   中英

user_passes_test:如果用戶未通過,則引發異常

[英]user_passes_test: raise exception if user does not pass

我試圖定義一個裝飾器,以檢查用戶是否具有管理員某些特權:

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異常)?

在Django 1.9+中,您可以使用UserPassesTestMixin而不是裝飾器,並將raise_exception設置為True

由於您使用的是不安全且過時的Django 1.4,因此您將無法執行此操作。 沒有使user_passes_test提高PermissionDenied而不是重定向的選項。 您可以嘗試在JavaScript中檢測重定向,或者查看user_passes_test源代碼並實現類似的操作以返回所需的響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM