Django: Как уничтожить сеанс пользователя после сброса / изменения пароля? - PullRequest
5 голосов
/ 01 марта 2012

Я недавно внедрил простое представление смены пароля в моем проекте django.Дело в том, что старый сеанс должен быть уничтожен по соображениям безопасности.Какой лучший способ сделать это, не прося пользователя войти снова.

Я думаю, я мог бы просто выйти / войти в него / что-то вроде этого:

from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout

@login_required
def change_password(request):
  # My stuff
  request.user.set_password(new_password)
  request.user.save()
  # I need this:
  logout(request)
  login(request,request.user)

Но я думаю,это не лучшая идея.Как вы думаете?

Есть ли другой способ сделать это?

Я что-то упустил?(Я имею в виду, это безопасно)

Ответы [ 4 ]

3 голосов
/ 28 мая 2014

Взгляните на это приложение https://github.com/atugushev/django-password-session. Этот пакет делает недействительными все сеансы (кроме текущего сеанса) после смены пароля.

Также эта функция, наконец, была реализована в Django 1.7. Смотри: https://docs.djangoproject.com/en/dev/topics/auth/default/#session-invalidation-on-password-change

2 голосов
/ 31 января 2016

Я только что узнал, что это теперь встроенная функция Django, и с 1.7:

https://docs.djangoproject.com/en/1.7/topics/auth/default/#session-invalidation-on-password-change

По сути, все сессии теперь содержат хэшпароль пользователя, поэтому, если пользователь когда-либо изменит свой пароль, все его существующие сеансы автоматически аннулируются.

Итак, краткий ответ на ваш вопрос: upgrade django.

Одна, возможно, нежелательная сторонаРезультатом этого изменения является то, что по умолчанию пользователю приходится снова входить в систему, как только он меняет свой пароль.Таким образом, вы, вероятно, на самом деле хотите, чтобы текущий пользовательский сеанс оставался в системе. Смотрите уже связанные документы, встроенные представления Django для изменения пароля делают это по умолчанию, или вы можете вручную вызвать функцию с именем * 1012.*

1 голос
/ 01 марта 2012

Я не понимаю, что это за причины безопасности, которые вынуждают сбрасывать сессию.Но, путь таков:

@login_required
def change_password(request):
  request.user.set_password(new_password)
  request.user.save()
  username = request.user.username
  logout(request)
  user = authenticate(username=username, password=new_password) #<-- here!!
  if user is not None:
      login(request,user)
  else:
      #raise your exception

Вы должны пройти аутентификацию перед входом в систему.Цитирование документа:

Вызов метода authenticate () первым При входе пользователя в систему вручную, вы должны вызвать authenticate (), прежде чем вызывать login ().authenticate () устанавливает атрибут для пользователя, отмечая, какой бэкэнд аутентификации успешно аутентифицировал этого пользователя (см. документацию бэкэнда), и эта информация понадобится позже во время процесса входа в систему.

1 голос
/ 01 марта 2012

django очищает сеанс при выходе из системы, поэтому все будет в порядке:

https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.logout

Когда вы вызываете logout (), данные сеанса для текущего запроса полностью очищаются. Все существующие данные удалены. Это необходимо для того, чтобы другой человек не мог использовать тот же веб-браузер для входа в систему и доступа к данным сеанса предыдущего пользователя.

...