注: 参考になれば、私は 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
これは、呼び出し可能なビューへのアクセスを提供しないバインドされたメソッド ( ) です。つまり、ミドルウェアによって設定されたフラグにアクセスできません。