2012-09-19 48 views
3

在我禁止的觀點中,我想將所有成員都重定向到他們的儀表板,如果他們訪問了一個頁面以供訪客使用,並且我想將所有訪客重定向到登錄頁面(如果他們訪問成員的頁面)。這很簡單。如何獲得金字塔中被調用視圖的權限?

但是,在某些情況下,我需要拋出HTTPForbidden錯誤,該錯誤不是失敗權限的原因,只是向用戶顯示原因。我如何確定HTTPForbidden是否是許可失敗或其他原因的結果?我想我可以用pyramid.security.has_permission做一些奇怪的事情(還沒有嘗試過),但必須有一個更簡單的方法。

從2011年它被指出,這方面的一個老問題是,做清單上How to check what permission failed in authorization in pyramid (pylons 2)?

回答

2

我沒有測試過,但我想嘗試做的是提高別的東西比HTTPForbidden手動執行此操作的地方。你甚至可以繼承HTTPForbidden

class WeDontLikeYourFace(HTTPForbidden): 
    pass 

def my_view(context, request): 
    if request['face'] != 'beautyful': 
     raise WeDontLikeYourFace("go away") 

然後,你可以爲你的自定義異常註冊一個自定義視圖,或者做一些,如果在HTTPForbidden註冊的共同觀點方法/別的東西。

您還可以將自定義字段添加到您的子類以傳遞您需要的任何信息。

+0

我想這樣做,但我希望有一個更簡單的方法。 – BDuelz

+0

此外,邏輯'show_forbidden_​​page()if exception.raised_because_permission_failed()else manually_raised_exception_show_reason(exception.reason_msg)'是不是很明確,感覺就像使用一個幾乎無意識的副作用手動引發異常,而不是通過Pyramid機械。 – Sergey

2

這不完全是你要求的,但它可能仍然有幫助。 已經給出了您的問題的正確答案:您最好提出一個比HTTPForbidden更合適的特定例外。

但是,如果您確實想要根據觸發HTTPForbidden異常的缺失權限更改禁用視圖的行爲,則需要獲取其名稱。 在HTTPForbidden.result.permissionHTTPForbidden例外對象內可以找到缺失權限的名稱。 但首先,需要將HTTPForbidden異常作爲禁止視圖的上下文傳遞。

例如,下面是我如何在我的web應用程序中使用它來通知用戶爲什麼他不能訪問某個特定功能,以便他可以讓經理根據需要重新配置ACL。

@forbidden_view_config(renderer='/forbidden.mako') 
def forbidden(context, request): 
    return { 'required_permission': context.result.permission } 

它適用於金字塔1.4。 我在文檔中找不到任何東西,所以我通過調試金字塔來破解它。 這比干淨的解決方案更適合解決問題。