diff --git a/django/contrib/auth/__init__.py b/django/contrib/auth/__init__.py index 95511dd688..17557627d1 100644 --- a/django/contrib/auth/__init__.py +++ b/django/contrib/auth/__init__.py @@ -86,7 +86,7 @@ def login(request, user): if SESSION_KEY in request.session: if request.session[SESSION_KEY] != user.pk or ( session_auth_hash and - request.session[HASH_SESSION_KEY] != session_auth_hash): + request.session.get(HASH_SESSION_KEY) != session_auth_hash): # To avoid reusing another user's session, create a new, empty # session if the existing session corresponds to a different # authenticated user. diff --git a/django/contrib/auth/tests/test_views.py b/django/contrib/auth/tests/test_views.py index 3dd8953d88..6f79516ff4 100644 --- a/django/contrib/auth/tests/test_views.py +++ b/django/contrib/auth/tests/test_views.py @@ -594,6 +594,22 @@ class LoginTest(AuthViewsTestCase): self.login(password='foobar') self.assertNotEqual(original_session_key, self.client.session.session_key) + def test_login_session_without_hash_session_key(self): + """ + Session without django.contrib.auth.HASH_SESSION_KEY should login + without an exception. + """ + user = User.objects.get(username='testclient') + engine = import_module(settings.SESSION_ENGINE) + session = engine.SessionStore() + session[SESSION_KEY] = user.id + session.save() + original_session_key = session.session_key + self.client.cookies[settings.SESSION_COOKIE_NAME] = original_session_key + + self.login() + self.assertNotEqual(original_session_key, self.client.session.session_key) + @skipIfCustomUser class LoginURLSettings(AuthViewsTestCase):