0

私は非常に驚くべき django_openid_auth ライブラリを使用して openid 機能を実装しています。しかし、私は非常に具体的なモデレーション設定を探しています。

openid は誰でも利用できるようになっていますが、以下のルールの実装を検討しています。

  • OpenIdはメールアドレスを提供する必要があります..すべての人が提供するわけではありません
  • 電子メール アドレスは、データベースに存在するアクセス許可リストの 1 つである必要があります

カスタム ミドルウェア、カスタム login_required デコレータなどを作成するなど、かなり可能な方法を考え始めました。

誰でも提案を追加できますか?

4

1 に答える 1

1

電子メール アドレスの取得は簡単です。openid サーバーに要求するだけです。django-openid-auth はそのための設定を提供します:

OPENID_SREG_EXTRA_FIELDS = ['email']

私のプロジェクトでは、認証後に追加の作業も必要でした。シグナルで解決しました:

def register_login_signal():
    from django.contrib.auth.signals import user_logged_in
    from django.contrib.auth.models import User
    user_logged_in.connect(your_function_name_here, sender = User)

def your_function_name_here(sender, **kwargs):
        request = kwargs.get('request')
        logout(request) if request.user.email not in your_list_of_authenticated_emails else pass

register_login_signal() をプロジェクトのinit .py ファイルのように使用される場所に配置することを忘れないでください

編集:

最初のコメント/質問。

追加フィールドの部分はドキュメントには記載されていません。また、github パッケージをスキャンすると、そのようなものは何もないことに気付くはずです。https://pypi.python.org/pypi/django-openid-auth/0.5の古いバージョンを使用しています。これをダウンロードして解凍し、django-openid-auth フォルダーにある views.py を開きます。OPENID_SREG_EXTRA_FIELDS を検索すると表示されます。settings.py で定義すると魅力的に機能します。

2番目の質問

非同期?いいえ、そうではありません。非同期は、現在の関数スタックの外で実行されるものになります-そのように説明できれば。これはそのようなものではありません。そのように想像してみてください-ログイン関数の最後に、ログイン関数の最後にフックされた関数があるかどうかのチェックがあります。そして、彼らは即座に実行されます。Djangoミドルウェアと同じくらい非同期です。まったくそうではありません。

しかし、それを行うのに適切な場所ですか?ユーザーが @login_required デコレータでログインしているかどうかを確認するようにサイトを設定していると思います-またはそのようなもの。

それでは、物事がどのように実行されるか見てみましょう:

1) openid サーバーは、最後の要求で要求したすべての情報を送信します

2) django-openid-auth login_complete ビューが引き継ぎ、バックエンドを使用してユーザーを認証します

3)そのプロセスの最後に、あなたが聞いている信号がトリガーされ、ユーザーの電子メールがリストに対してチェックされ、チェックが失敗した場合、彼は即座にログアウトされます。

4) ビューが完了すると、元のビューで "next" パラメータで指定された URL または設定で指定された LOGIN_REDIRECT_URL に自動的にリダイレクトされます。

5) そのビューの前に、すべてのミドルウェアとデコレーターが使用されます。@login_required デコレータのようなものを使用した場合 (これは、ログイン保護されたページごとに行うのが賢明です)、ユーザーを即座にログイン ページにリダイレクトします。シグナルで要求するために何らかのメッセージを追加することを気にした場合、メッセージが表示されます (ログイン/ログアウト ページがそれをサポートしている場合)。

そして最後に何か言いたいのですが、ログアウトするよりも強力な方法はありません。

/編集

于 2013-12-12T12:37:23.907 に答える