77

パスワードを使用せずに手動 (サーバー側で開始) のログインを実装するための最良の方法を見つけるのを手伝ってくれることを願っています. ワークフローを説明しましょう。

  • ユーザー登録
  • ありがとうございました!アクティベーション リンクが記載されたメールが送信されました blablabla
  • (アカウントは現在存在しますが、無効とマークされています)
  • ユーザーがメールを開き、リンクをクリックする
  • (アカウントは有効です)
  • ありがとうございました!サイトが使えるようになりました

私がやろうとしているのは、ユーザーが電子メールのリンクをクリックした後にログインして、すぐに Web サイトの使用を開始できるようにすることです。

DB で暗号化されているため、彼のパスワードを使用できません。カスタム認証バックエンドを作成する唯一のオプションですか?

4

5 に答える 5

99

ユーザーのログインにパスワードは必要ありません。このauth.login関数Userオブジェクトを取得するだけです。これは、アカウントを有効にしたときにデータベースから取得していると思われます。したがって、それを に直接渡すことができますlogin

もちろん、ユーザーがすでに有効になっている既存のアカウントへのリンクを偽装して、そのユーザーとして自動的にログインすることがないように十分注意する必要があります。

from django.contrib.auth import login

def activate_account(request, hash):
    account = get_account_from_hash(hash)
    if not account.is_active:
        account.activate()
        account.save()
        user = account.user
        login(request, user)

...など

編集

authenticateうーん、余分なプロパティが追加されるため、使用する必要があることに気づきませんでした。backendコードを見ると、認証バックエンドのモジュール パスに相当する属性しかありません。だからあなたはそれを偽造することができます-上記のログイン呼び出しの前に、これを行います:

user.backend = 'django.contrib.auth.backends.ModelBackend'
于 2010-05-07T10:12:31.287 に答える
26

ダニエルの答えはとても良いです。

それを行う別の方法は、次のようにカスタム認証バックエンドhttps://docs.djangoproject.com/en/1.8/topics/auth/customizing/#writing-an-authentication-backendに従って HashModelBackend を作成することです:

class HashModelBackend(object):
    def authenticate(self, hash=None):
        user = get_user_from_hash(hash)
        return user

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

そして、これを設定にインストールします:

AUTHENTICATION_BACKENDS = (
    'myproject.backends.HashModelBackend',
    'django.contrib.auth.backends.ModelBackend',
)

次に、ビューは次のようになります。

def activate_account(request, hash):
    user = authenticate(hash=hash)
    if user:
        # check if user is_active, and any other checks
        login(request, user)
    else:
        return user_not_found_bad_hash_message
于 2010-05-07T11:12:32.573 に答える