2

私は2つの部分を持つピラミッドプロジェクトを持っています:

  • /_hq/ログインページによる認証が必要
  • /_rest/RESTful 認証が必要 (HTTP Basic/Digest 認証による)

そこで、 HQFactoryRESTFactoryという 2 つの主要なリソース ファクトリを含むルートを追加します。リソースごとに AuthenticationPolicy を切り替える認証ポリシー スイッチャーを作成しました。出来た。

ACLAuthorizationPolicy も使用します。

リクエストごとに、ログイン ページまたは401 HTTP ステータスを返したいのですが、どのリソース ファクトリがアクセスされているかによって異なります。

私の問題は、1 つのビューに対してのみ@forbidden_​​view_configを実行できることです。リソース ファクトリごとのビッデン ビューまたは問題の別のソリューションを指定するにはどうすればよいですか?

ありがとうございました

解決済み - 解決策

最も簡単な方法は、Michael Merickel の回答です (以下で確認できます)。ここに別の方法があります:

非推奨

view_config の custom_predicates 引数を使用して問題を解決しました。これです。

カスタム述語として関数を作成しました。

def resource_factory_predicate(factory):
    def check_factory(context, request):
        return isinstance(request.context, factory)
return check_factory

次に、ここに私のviews.pyがあります

# views.py
@forbidden_view_config(
custom_predicates=(resource_factory_predicate(RootFactory),))
def login_required(request):
    userid = authenticated_userid(request)

    if userid is not None:
        return HTTPForbidden("You're not authorized for this action")

    # redirect to login page


@forbidden_view_config(renderer='json',
    custom_predicates=(resource_factory_predicate(RESTfulFactory),))
def http_403_unauthenticated(request):
    request.response.status = 403
    return {
        'status': 0,
        'message': 'Forbidden',
    }
4

2 に答える 2

3

コンテキストに基づいて例外ビューをディスパッチすることはできませんが (例外はコンテキストとして使用されます) 、指定された型が実際のコンテキストにcontainmentあることを要求するオプションをごまかして使用することは可能です。lineageこれは、その下のコンテキストで例外が発生し、トラバーサル階層のサブツリー全体に影響する場合にも一致することを意味します。

@forbidden_view_config(containment=MyRootA)
def root_a_forbidden(exc, request):
    # note that the actual context is available on request.context
    pass

@forbidden_view_config(containment=MyRootB)
def root_b_forbidden(exc, request):
    pass
于 2013-07-16T16:09:13.647 に答える
1

禁止されたビューは、実際には他のビューと同じです。@forbidden_view_config()デコレータのドキュメントを参照してください:

禁止されたビューpyramid.view.view_configを登録する類似物。

コンストラクターは、のforbidden_view_configコンストラクターと同じ引数のほとんどを受け入れますpyramid.view.view_config。同じ場所で使用でき、「通常の」ビューの代わりに禁止された例外ビューを常に登録することを除いて、ほぼ同じように動作します。

これは、同じ述語を受け入れることを意味pyramid.view.view_config()します。デコレータは基本的に を呼び出しますadd_forbidden_view()。これは、その引数をデコレータで使用できることを意味します。そのメソッドのドキュメントでは明示的に除外されていますcontextが、ルート名オプションです:

@forbidden_view_config(route_name='hq'):
def forbidden_for_hq(request):
    # ...

@forbidden_view_config(route_name='rest'):
def forbidden_for_rest(request):
    # ...

マップするルートが多すぎる場合は、カスタム述語の使用を検討してください。カスタム認証ポリシー スイッチャーが既にあります。必要なのは、使用されているポリシーを検出するカスタム述語を追加することだけです。

于 2013-07-16T10:41:19.800 に答える