3

禁止されているビューでは、ゲストのページにアクセスした場合はすべてのメンバーをダッシュ​​ボードにリダイレクトし、メンバーのページにアクセスした場合はすべてのゲストをログインページにリダイレクトします。これは簡単です。

ただし、アクセス許可の失敗の原因ではないHTTPForbiddenエラーをスローし、ユーザーに理由を表示する必要がある場合があります。HTTPForbiddenがアクセス許可の失敗またはその他の理由の結果であるかどうかをどのように判断できますか?私はpyramid.security.has_permission(まだ試していませんが)奇妙なことをすることができると思いますが、もっと簡単な方法が必要です。

これがやることリストにあると述べられた2011年の古い質問ピラミッド(パイロン2)でどの許可が承認に失敗したかを確認する方法は?

4

2 に答える 2

3

これはあなたが求めていたものとは異なりますが、それでも役立つ場合があります。あなたの質問に対する正しい答えはすでに与えられています:あなたはより適切な特定の例外を提起したほうがよいでしょうHTTPForbidden

ただし、例外をトリガーした権限の欠落に応じて禁止ビューの動作を本当に変更したい場合は、HTTPForbiddenその名前を取得する必要があります。欠落している権限の名前は、のHTTPForbidden例外オブジェクト内にありますHTTPForbidden.result.permission。ただし、最初に、HTTPForbidden禁止されたビューのコンテキストとして例外を渡す必要があります。

たとえば、これをWebアプリで使用して、特定の機能にアクセスできない理由をユーザーに通知し、必要に応じてACLを再構成するようにマネージャーに依頼できるようにする方法を次に示します。

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

ピラミッド1.4で動作します。ドキュメントに何も見つからなかったので、ピラミッドをデバッグしてこれをハッキングしました。これは、クリーンなソリューションというよりも回避策です。

于 2013-01-11T17:47:25.683 に答える
2

HTTPForbidden私はそれをテストしていませんが、私がやろうとしていることは、あなたがこれを手動で行う場所以外の何かを上げることです。サブクラス化することもできますHTTPForbidden

class WeDontLikeYourFace(HTTPForbidden):
    pass

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

次に、カスタム例外のカスタムビューを登録するか、HTTPForbiddenに登録されている共通のviewメソッドでif/elseを実行できます。

サブクラスにカスタムフィールドを追加して、必要な情報を渡すこともできます。

于 2012-09-20T00:26:03.827 に答える