2012-02-29 2 views
4

Недавно я реализовал простой просмотр пароля с изменениями в моем проекте django. Дело в том, что старая сессия должна быть уничтожена по соображениям безопасности. Каков наилучший способ сделать это, не попросив пользователя снова войти в систему.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) 

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

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

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

ответ

1

Джанго очищает сеанс при выходе, так что вы будете хорошо:

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

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

+1

Я надеваю Не хотите регистрировать пользователя. – santiagobasulto

1

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

@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 

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

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

+1

Предположим, вы считаете, что пароль был «украден». Вы сейчас находитесь на своем домашнем ПК, поэтому вы меняете свой пароль. Но что произойдет, если у вас был сеанс, инициализированный на рабочем компьютере? Эта сессия все еще жива, поэтому вам нужно ее убить. Это причина безопасности. – santiagobasulto

+0

Santiago, hasta donde yo conozco, текущая текущая сессия не закрывает все остальные сеансы пользователя сайта. – danihp

3

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

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

1

Я только что узнал, что это теперь встроенный в особенности Django, и было с 1.7:

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

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

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

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

Смежные вопросы