2

: 参考になれば、私は Pyramid 1.3.2 を使用しています。少し古くなっていることはわかっています。すぐに更新したくないのですが、最新バージョンがこのユースケースにより適切なサポートを提供する場合は、強制的に更新できる可能性があります。

私が取り組んでいる Pyramid ベースのアプリケーションには、厳密な承認ポリシーがあります。つまり、すべての呼び出しを認証する必要があります。1) すべてのリクエスト ハンドラにこれを手動で追加するのは面倒です。2) 誰にも認証の追加を「忘れて」ほしくないため、すべての着信要求を検証する単純な Pyramid ミドルウェア (トゥイーン) を使用して、サーバー全体でこれを強制します。

最近、この制限が少し緩和されました:GET認証なしで (安全で冪等な) リソースをサポートする必要がある場合があります。

これは、ほとんどの Web フレームワークの認証 (オプションの認証) の背後にある通常の設計思想とは正反対のように思われるため、期待どおりに機能させることはできません。

質問: デフォルトで承認を認証および検証するが、ビューごとに無効にできる承認ミドルウェアを実装するための正しいアプローチは何ですか?


これまでのところ、次のような単純なデコレータを追加してみました:

def allows_anonymous_access(f):
  f.allows_anonymous_access = True; return f

@allows_anonymous_access
def my_pyramid_view(request):
  # ...

私のミドルウェアでは、次のように使用したいと思います。

def authorization_middleware(handler, registry):
  def verify_authorization(request):
    # Identify the user making the request.  Make sure we get the
    # user's identify if provided, even when the request handler
    # allows anonymous access.
    try:
      request.principal = extract_user(request)
    except InvalidCredentials, error:
      if getattr(handler, 'allows_anonymous_access', False):
        request.principal = AnonymousUser()
      else:
        raise HTTPUnauthorized(...)
    # Invoke the handler.
    return handler(request)
  # Middleware that will pre/post-process the request.
  return authorization_middleware

ただし、ミドルウェアが実行されるときは、handler私の見解ではありません。pyramid.router.Router.handle_requestこれは、呼び出し可能なビューへのアクセスを提供しないバインドされたメソッド ( ) です。つまり、ミドルウェアによって設定されたフラグにアクセスできません。

4

1 に答える 1

0

あなたはおそらくしたいですpyramid.config.set_default_permission(permission)ドキュメントから:

既定のアクセス許可を追加すると、アプリケーション ポリシーで特定のビューに対して何らかの例外が必要でない限り、明示的なアクセス許可で各ビュー構成を保護する必要がなくなります。

既定のアクセス許可が有効な場合、完全に匿名でアクセスできるビュー (例外ビュービューであっても) を作成するためのビュー構成では、 importable as としてインポート可能なアクセス許可の値を使用する 必要pyramid.security.NO_PERMISSION_REQUIREDがあります。この文字列をpermissionビュー構成の として使用すると、既定のアクセス許可が無視され、ビューが登録され、資格情報に関係なくすべての呼び出し元が使用できるようになります。

#pyramid freenode IRC チャネルで raydeo_によって提供された回答。

于 2013-06-10T20:59:43.720 に答える