1. ホーム
  2. django

パスワードのないユーザーを手動でログインさせる

2023-10-27 08:25:30

質問

手動 (サーバーサイドから) ログインを実装するための最良の方法について教えてください。 なしで を使用することなく、手動でログインするための最良の方法を見つける手助けをしていただければと思います。ワークフローを説明させてください。

  • ユーザーが登録する
  • ありがとうございます。アクティベーションリンクを含むメールが送信されました blablabla
  • (アカウントは存在しますが、有効ではありませんと表示されます。)
  • ユーザーがメールを開き、リンクをクリックする
  • (アカウントが有効)
  • ありがとうございました。これで、サイトを利用することができます

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

彼のパスワードはDBで暗号化されているので使用できません。

どのように解決するのですか?

ユーザーをログインさせるのにパスワードは必要ありません。その 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)

... など

Edited :

うーん、気づかなかったけど authenticate を使用する必要があることに気づきませんでした。コードを見てみると、やっていることはすべて backend 属性が認証用バックエンドのモジュールパスと等価になっているだけです。だから、あなたはそれを偽造することができます - 上記のログイン呼び出しの前に、これを行います。

user.backend = 'django.contrib.auth.backends.ModelBackend'