Функция update_session_auth_hash

Функция update_session_auth_hash применяется к объекту запроса и модели пользователя для синхронизации хэша сессии с новым паролем. Она принимает два обязательных аргумента: объект запроса и объект пользователя. Без вызова этой функции после смены пароля пользователь будет автоматически разлогинен, так как хэш сессии перестанет соответствовать новому паролю.

Синтаксис

pythonfrom django.contrib.auth import update_session_auth_hash

update_session_auth_hash(request, user)

Пример

Рассмотрим базовый пример использования функции во вьюхе для смены пароля:

pythonfrom django.contrib.auth import update_session_auth_hash
from django.contrib.auth.forms import PasswordChangeForm
from django.shortcuts import render, redirect
from django.contrib import messages

def change_password(request):
  if request.method == 'POST':
    form = PasswordChangeForm(request.user, request.POST)
    if form.is_valid():
      user = form.save()
      update_session_auth_hash(request, user)
      messages.success(request, "Password changed successfully")
      return redirect('profile')
  else:
    form = PasswordChangeForm(request.user)
  return render(request, 'change_password.html', {'form': form})

Результат выполнения кода:

python"Password changed successfully"
"User remains logged in"

Пример

Пример использования функции при ручной смене пароля без использования формы:

pythonfrom django.contrib.auth import update_session_auth_hash
from django.contrib.auth.models import User
from django.shortcuts import redirect

def manual_password_change(request):
  user = request.user
  new_password = "new_secure_password_123"
  user.set_password(new_password)
  user.save()

  update_session_auth_hash(request, user)

  return redirect('profile')

Результат выполнения кода:

python"User password updated"
"Session hash synchronized"

Пример

Важно помнить, что без вызова update_session_auth_hash пользователь будет разлогинен. Демонстрация проблемы:

pythonfrom django.contrib.auth.models import User
from django.shortcuts import redirect

def broken_password_change(request):
  user = request.user
  user.set_password("new_password")
  user.save()

  # Пропущен вызов update_session_auth_hash
  # Пользователь будет разлогинен

  return redirect('profile')

Результат выполнения кода:

python"Password changed but user is logged out"
"User redirected to login page"

Смотрите также

  • функция authenticate,
    которая проверяет учетные данные пользователя
  • функция login,
    которая авторизует пользователя в системе
  • функция logout,
    которая разлогинивает пользователя
  • метод set_password,
    который устанавливает новый хэш пароля для пользователя