3

Mozilla Persona(browserid)をPyramidアプリケーションに統合しようとしています。ログインプロセスは次のとおりです。

  1. ユーザーはログインボタンをクリックして任意のページにログインできます
  2. 次に、ポップアップにログインフォームが表示されます
  3. ユーザーが正しいログイン/パスワードを入力すると、ユーザーの資格情報をチェックするPyramidビューへのポップアップによってajax呼び出しが行われ、チェックが成功した場合はPyramid記憶機能が呼び出されます。
  4. その後、browseridjavascriptコードは現在のページをリロードします

ここで、新しいユーザーがWebアプリをサブスクライブする場合を処理し、いくつかの詳細(必要なユーザー名など)を要求する新しいビューを表示したいと思います。

「remember」関数はポップアップからのajax呼び出しによって呼び出されるため、ユーザーを「/newuser」ページにリダイレクトできません。したがって、記憶されているbrowseridに対応するユーザーがデータベースにない場合は常に、すべてのビューで新しいユーザーを「/newuser」URLにリダイレクトする必要があります。

ビューを呼び出して代わりに「new_user」ビューを呼び出す前に、ユーザー要求をインターセプトする方法はありますか?または、私の認証アプローチが根本的に正しくなく、別のアプローチに頼るべきでしょうか?

4

1 に答える 1

4

これを行う1つの方法は、ユーザーの作成時に発生するはずの例外を作成し、この例外を新しいページにリダイレクトするビューのコンテキストとして使用することです。

class NewUser(Exception):
    pass

@view_config(context=NewUser)
def new_user_exception(request):
    return HTTPFound(request.route_path('new_user'))

最初のログイン後(たとえば、ユーザーオブジェクトを作成した後)の最初の要求中に例外が発生することを確認してください。そうすると、ユーザーは正しいページにリダイレクトされます。

ウェルカムページのコードを直接に配置することもできますが、new_user_exceptionリダイレクトしないと、このページには、ユーザーが要求したURLが含まれます。


別の解決策は、ペルソナの部分がどのように行われるかを微調整することです。そのために、私はあなたがpyramid_personaを使用していると推測します(私はライターです:))。そうでない場合でも、私が言っていることは当てはまり、さらに簡単になります。

あなたができることは:

  • ログインビューを変更して、これが最初のログインであるかどうかを示すブール値が応答に含まれるようにします。
  • javascriptを変更してこのブール値を確認し、初めてでない場合はページをリロードし、初めてでない場合はウェルカムページにリダイレクトします。

ログインビューのコードは、pyramid_personaのログインビューを次のように使用できます。

from pyramid_persona.views import login

@view_config(route_name='login')
def new_login(request):
    response = login(request)
    if response.status == 200: #the login worked
        # tweak the response
    return response

編集:pyramid_personaのドキュメントにこれに関する部分があります:ログイン時に追加の作業または検証を行います

于 2012-11-30T15:41:21.633 に答える