test_auth_backends.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. from __future__ import unicode_literals
  2. from datetime import date
  3. from django.contrib.auth import BACKEND_SESSION_KEY, authenticate, get_user
  4. from django.contrib.auth.backends import ModelBackend
  5. from django.contrib.auth.hashers import MD5PasswordHasher
  6. from django.contrib.auth.models import AnonymousUser, Group, Permission, User
  7. from django.contrib.auth.tests.custom_user import (
  8. CustomPermissionsUser, CustomUser, ExtensionUser,
  9. )
  10. from django.contrib.contenttypes.models import ContentType
  11. from django.core.exceptions import ImproperlyConfigured, PermissionDenied
  12. from django.http import HttpRequest
  13. from django.test import TestCase, modify_settings, override_settings
  14. class CountingMD5PasswordHasher(MD5PasswordHasher):
  15. """Hasher that counts how many times it computes a hash."""
  16. calls = 0
  17. def encode(self, *args, **kwargs):
  18. type(self).calls += 1
  19. return super(CountingMD5PasswordHasher, self).encode(*args, **kwargs)
  20. class BaseModelBackendTest(object):
  21. """
  22. A base class for tests that need to validate the ModelBackend
  23. with different User models. Subclasses should define a class
  24. level UserModel attribute, and a create_users() method to
  25. construct two users for test purposes.
  26. """
  27. backend = 'django.contrib.auth.backends.ModelBackend'
  28. def setUp(self):
  29. self.patched_settings = modify_settings(
  30. AUTHENTICATION_BACKENDS={'append': self.backend},
  31. )
  32. self.patched_settings.enable()
  33. self.create_users()
  34. def tearDown(self):
  35. self.patched_settings.disable()
  36. # The custom_perms test messes with ContentTypes, which will
  37. # be cached; flush the cache to ensure there are no side effects
  38. # Refs #14975, #14925
  39. ContentType.objects.clear_cache()
  40. def test_has_perm(self):
  41. user = self.UserModel._default_manager.get(pk=self.user.pk)
  42. self.assertEqual(user.has_perm('auth.test'), False)
  43. user.is_staff = True
  44. user.save()
  45. self.assertEqual(user.has_perm('auth.test'), False)
  46. user.is_superuser = True
  47. user.save()
  48. self.assertEqual(user.has_perm('auth.test'), True)
  49. user.is_staff = True
  50. user.is_superuser = True
  51. user.is_active = False
  52. user.save()
  53. self.assertEqual(user.has_perm('auth.test'), False)
  54. def test_custom_perms(self):
  55. user = self.UserModel._default_manager.get(pk=self.user.pk)
  56. content_type = ContentType.objects.get_for_model(Group)
  57. perm = Permission.objects.create(name='test', content_type=content_type, codename='test')
  58. user.user_permissions.add(perm)
  59. # reloading user to purge the _perm_cache
  60. user = self.UserModel._default_manager.get(pk=self.user.pk)
  61. self.assertEqual(user.get_all_permissions() == {'auth.test'}, True)
  62. self.assertEqual(user.get_group_permissions(), set())
  63. self.assertEqual(user.has_module_perms('Group'), False)
  64. self.assertEqual(user.has_module_perms('auth'), True)
  65. perm = Permission.objects.create(name='test2', content_type=content_type, codename='test2')
  66. user.user_permissions.add(perm)
  67. perm = Permission.objects.create(name='test3', content_type=content_type, codename='test3')
  68. user.user_permissions.add(perm)
  69. user = self.UserModel._default_manager.get(pk=self.user.pk)
  70. self.assertEqual(user.get_all_permissions(), {'auth.test2', 'auth.test', 'auth.test3'})
  71. self.assertEqual(user.has_perm('test'), False)
  72. self.assertEqual(user.has_perm('auth.test'), True)
  73. self.assertEqual(user.has_perms(['auth.test2', 'auth.test3']), True)
  74. perm = Permission.objects.create(name='test_group', content_type=content_type, codename='test_group')
  75. group = Group.objects.create(name='test_group')
  76. group.permissions.add(perm)
  77. user.groups.add(group)
  78. user = self.UserModel._default_manager.get(pk=self.user.pk)
  79. exp = {'auth.test2', 'auth.test', 'auth.test3', 'auth.test_group'}
  80. self.assertEqual(user.get_all_permissions(), exp)
  81. self.assertEqual(user.get_group_permissions(), {'auth.test_group'})
  82. self.assertEqual(user.has_perms(['auth.test3', 'auth.test_group']), True)
  83. user = AnonymousUser()
  84. self.assertEqual(user.has_perm('test'), False)
  85. self.assertEqual(user.has_perms(['auth.test2', 'auth.test3']), False)
  86. def test_has_no_object_perm(self):
  87. """Regressiontest for #12462"""
  88. user = self.UserModel._default_manager.get(pk=self.user.pk)
  89. content_type = ContentType.objects.get_for_model(Group)
  90. perm = Permission.objects.create(name='test', content_type=content_type, codename='test')
  91. user.user_permissions.add(perm)
  92. self.assertEqual(user.has_perm('auth.test', 'object'), False)
  93. self.assertEqual(user.get_all_permissions('object'), set())
  94. self.assertEqual(user.has_perm('auth.test'), True)
  95. self.assertEqual(user.get_all_permissions(), {'auth.test'})
  96. def test_anonymous_has_no_permissions(self):
  97. """
  98. #17903 -- Anonymous users shouldn't have permissions in
  99. ModelBackend.get_(all|user|group)_permissions().
  100. """
  101. backend = ModelBackend()
  102. user = self.UserModel._default_manager.get(pk=self.user.pk)
  103. content_type = ContentType.objects.get_for_model(Group)
  104. user_perm = Permission.objects.create(name='test', content_type=content_type, codename='test_user')
  105. group_perm = Permission.objects.create(name='test2', content_type=content_type, codename='test_group')
  106. user.user_permissions.add(user_perm)
  107. group = Group.objects.create(name='test_group')
  108. user.groups.add(group)
  109. group.permissions.add(group_perm)
  110. self.assertEqual(backend.get_all_permissions(user), {'auth.test_user', 'auth.test_group'})
  111. self.assertEqual(backend.get_user_permissions(user), {'auth.test_user', 'auth.test_group'})
  112. self.assertEqual(backend.get_group_permissions(user), {'auth.test_group'})
  113. user.is_anonymous = lambda: True
  114. self.assertEqual(backend.get_all_permissions(user), set())
  115. self.assertEqual(backend.get_user_permissions(user), set())
  116. self.assertEqual(backend.get_group_permissions(user), set())
  117. def test_inactive_has_no_permissions(self):
  118. """
  119. #17903 -- Inactive users shouldn't have permissions in
  120. ModelBackend.get_(all|user|group)_permissions().
  121. """
  122. backend = ModelBackend()
  123. user = self.UserModel._default_manager.get(pk=self.user.pk)
  124. content_type = ContentType.objects.get_for_model(Group)
  125. user_perm = Permission.objects.create(name='test', content_type=content_type, codename='test_user')
  126. group_perm = Permission.objects.create(name='test2', content_type=content_type, codename='test_group')
  127. user.user_permissions.add(user_perm)
  128. group = Group.objects.create(name='test_group')
  129. user.groups.add(group)
  130. group.permissions.add(group_perm)
  131. self.assertEqual(backend.get_all_permissions(user), {'auth.test_user', 'auth.test_group'})
  132. self.assertEqual(backend.get_user_permissions(user), {'auth.test_user', 'auth.test_group'})
  133. self.assertEqual(backend.get_group_permissions(user), {'auth.test_group'})
  134. user.is_active = False
  135. user.save()
  136. self.assertEqual(backend.get_all_permissions(user), set())
  137. self.assertEqual(backend.get_user_permissions(user), set())
  138. self.assertEqual(backend.get_group_permissions(user), set())
  139. def test_get_all_superuser_permissions(self):
  140. """A superuser has all permissions. Refs #14795."""
  141. user = self.UserModel._default_manager.get(pk=self.superuser.pk)
  142. self.assertEqual(len(user.get_all_permissions()), len(Permission.objects.all()))
  143. @override_settings(PASSWORD_HASHERS=['auth_tests.test_auth_backends.CountingMD5PasswordHasher'])
  144. def test_authentication_timing(self):
  145. """Hasher is run once regardless of whether the user exists. Refs #20760."""
  146. # Re-set the password, because this tests overrides PASSWORD_HASHERS
  147. self.user.set_password('test')
  148. self.user.save()
  149. CountingMD5PasswordHasher.calls = 0
  150. username = getattr(self.user, self.UserModel.USERNAME_FIELD)
  151. authenticate(username=username, password='test')
  152. self.assertEqual(CountingMD5PasswordHasher.calls, 1)
  153. CountingMD5PasswordHasher.calls = 0
  154. authenticate(username='no_such_user', password='test')
  155. self.assertEqual(CountingMD5PasswordHasher.calls, 1)
  156. class ModelBackendTest(BaseModelBackendTest, TestCase):
  157. """
  158. Tests for the ModelBackend using the default User model.
  159. """
  160. UserModel = User
  161. def create_users(self):
  162. self.user = User.objects.create_user(
  163. username='test',
  164. email='test@example.com',
  165. password='test',
  166. )
  167. self.superuser = User.objects.create_superuser(
  168. username='test2',
  169. email='test2@example.com',
  170. password='test',
  171. )
  172. @override_settings(AUTH_USER_MODEL='auth.ExtensionUser')
  173. class ExtensionUserModelBackendTest(BaseModelBackendTest, TestCase):
  174. """
  175. Tests for the ModelBackend using the custom ExtensionUser model.
  176. This isn't a perfect test, because both the User and ExtensionUser are
  177. synchronized to the database, which wouldn't ordinary happen in
  178. production. As a result, it doesn't catch errors caused by the non-
  179. existence of the User table.
  180. The specific problem is queries on .filter(groups__user) et al, which
  181. makes an implicit assumption that the user model is called 'User'. In
  182. production, the auth.User table won't exist, so the requested join
  183. won't exist either; in testing, the auth.User *does* exist, and
  184. so does the join. However, the join table won't contain any useful
  185. data; for testing, we check that the data we expect actually does exist.
  186. """
  187. UserModel = ExtensionUser
  188. def create_users(self):
  189. self.user = ExtensionUser._default_manager.create_user(
  190. username='test',
  191. email='test@example.com',
  192. password='test',
  193. date_of_birth=date(2006, 4, 25)
  194. )
  195. self.superuser = ExtensionUser._default_manager.create_superuser(
  196. username='test2',
  197. email='test2@example.com',
  198. password='test',
  199. date_of_birth=date(1976, 11, 8)
  200. )
  201. @override_settings(AUTH_USER_MODEL='auth.CustomPermissionsUser')
  202. class CustomPermissionsUserModelBackendTest(BaseModelBackendTest, TestCase):
  203. """
  204. Tests for the ModelBackend using the CustomPermissionsUser model.
  205. As with the ExtensionUser test, this isn't a perfect test, because both
  206. the User and CustomPermissionsUser are synchronized to the database,
  207. which wouldn't ordinary happen in production.
  208. """
  209. UserModel = CustomPermissionsUser
  210. def create_users(self):
  211. self.user = CustomPermissionsUser._default_manager.create_user(
  212. email='test@example.com',
  213. password='test',
  214. date_of_birth=date(2006, 4, 25)
  215. )
  216. self.superuser = CustomPermissionsUser._default_manager.create_superuser(
  217. email='test2@example.com',
  218. password='test',
  219. date_of_birth=date(1976, 11, 8)
  220. )
  221. @override_settings(AUTH_USER_MODEL='auth.CustomUser')
  222. class CustomUserModelBackendAuthenticateTest(TestCase):
  223. """
  224. Tests that the model backend can accept a credentials kwarg labeled with
  225. custom user model's USERNAME_FIELD.
  226. """
  227. def test_authenticate(self):
  228. test_user = CustomUser._default_manager.create_user(
  229. email='test@example.com',
  230. password='test',
  231. date_of_birth=date(2006, 4, 25)
  232. )
  233. authenticated_user = authenticate(email='test@example.com', password='test')
  234. self.assertEqual(test_user, authenticated_user)
  235. class TestObj(object):
  236. pass
  237. class SimpleRowlevelBackend(object):
  238. def has_perm(self, user, perm, obj=None):
  239. if not obj:
  240. return # We only support row level perms
  241. if isinstance(obj, TestObj):
  242. if user.username == 'test2':
  243. return True
  244. elif user.is_anonymous() and perm == 'anon':
  245. return True
  246. elif not user.is_active and perm == 'inactive':
  247. return True
  248. return False
  249. def has_module_perms(self, user, app_label):
  250. if not user.is_anonymous() and not user.is_active:
  251. return False
  252. return app_label == "app1"
  253. def get_all_permissions(self, user, obj=None):
  254. if not obj:
  255. return [] # We only support row level perms
  256. if not isinstance(obj, TestObj):
  257. return ['none']
  258. if user.is_anonymous():
  259. return ['anon']
  260. if user.username == 'test2':
  261. return ['simple', 'advanced']
  262. else:
  263. return ['simple']
  264. def get_group_permissions(self, user, obj=None):
  265. if not obj:
  266. return # We only support row level perms
  267. if not isinstance(obj, TestObj):
  268. return ['none']
  269. if 'test_group' in [group.name for group in user.groups.all()]:
  270. return ['group_perm']
  271. else:
  272. return ['none']
  273. @modify_settings(AUTHENTICATION_BACKENDS={
  274. 'append': 'auth_tests.test_auth_backends.SimpleRowlevelBackend',
  275. })
  276. class RowlevelBackendTest(TestCase):
  277. """
  278. Tests for auth backend that supports object level permissions
  279. """
  280. def setUp(self):
  281. self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
  282. self.user2 = User.objects.create_user('test2', 'test2@example.com', 'test')
  283. self.user3 = User.objects.create_user('test3', 'test3@example.com', 'test')
  284. def tearDown(self):
  285. # The get_group_permissions test messes with ContentTypes, which will
  286. # be cached; flush the cache to ensure there are no side effects
  287. # Refs #14975, #14925
  288. ContentType.objects.clear_cache()
  289. def test_has_perm(self):
  290. self.assertEqual(self.user1.has_perm('perm', TestObj()), False)
  291. self.assertEqual(self.user2.has_perm('perm', TestObj()), True)
  292. self.assertEqual(self.user2.has_perm('perm'), False)
  293. self.assertEqual(self.user2.has_perms(['simple', 'advanced'], TestObj()), True)
  294. self.assertEqual(self.user3.has_perm('perm', TestObj()), False)
  295. self.assertEqual(self.user3.has_perm('anon', TestObj()), False)
  296. self.assertEqual(self.user3.has_perms(['simple', 'advanced'], TestObj()), False)
  297. def test_get_all_permissions(self):
  298. self.assertEqual(self.user1.get_all_permissions(TestObj()), {'simple'})
  299. self.assertEqual(self.user2.get_all_permissions(TestObj()), {'simple', 'advanced'})
  300. self.assertEqual(self.user2.get_all_permissions(), set())
  301. def test_get_group_permissions(self):
  302. group = Group.objects.create(name='test_group')
  303. self.user3.groups.add(group)
  304. self.assertEqual(self.user3.get_group_permissions(TestObj()), {'group_perm'})
  305. @override_settings(
  306. AUTHENTICATION_BACKENDS=['auth_tests.test_auth_backends.SimpleRowlevelBackend'],
  307. )
  308. class AnonymousUserBackendTest(TestCase):
  309. """
  310. Tests for AnonymousUser delegating to backend.
  311. """
  312. def setUp(self):
  313. self.user1 = AnonymousUser()
  314. def test_has_perm(self):
  315. self.assertEqual(self.user1.has_perm('perm', TestObj()), False)
  316. self.assertEqual(self.user1.has_perm('anon', TestObj()), True)
  317. def test_has_perms(self):
  318. self.assertEqual(self.user1.has_perms(['anon'], TestObj()), True)
  319. self.assertEqual(self.user1.has_perms(['anon', 'perm'], TestObj()), False)
  320. def test_has_module_perms(self):
  321. self.assertEqual(self.user1.has_module_perms("app1"), True)
  322. self.assertEqual(self.user1.has_module_perms("app2"), False)
  323. def test_get_all_permissions(self):
  324. self.assertEqual(self.user1.get_all_permissions(TestObj()), {'anon'})
  325. @override_settings(AUTHENTICATION_BACKENDS=[])
  326. class NoBackendsTest(TestCase):
  327. """
  328. Tests that an appropriate error is raised if no auth backends are provided.
  329. """
  330. def setUp(self):
  331. self.user = User.objects.create_user('test', 'test@example.com', 'test')
  332. def test_raises_exception(self):
  333. self.assertRaises(ImproperlyConfigured, self.user.has_perm, ('perm', TestObj(),))
  334. @override_settings(AUTHENTICATION_BACKENDS=['auth_tests.test_auth_backends.SimpleRowlevelBackend'])
  335. class InActiveUserBackendTest(TestCase):
  336. """
  337. Tests for an inactive user
  338. """
  339. def setUp(self):
  340. self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
  341. self.user1.is_active = False
  342. self.user1.save()
  343. def test_has_perm(self):
  344. self.assertEqual(self.user1.has_perm('perm', TestObj()), False)
  345. self.assertEqual(self.user1.has_perm('inactive', TestObj()), True)
  346. def test_has_module_perms(self):
  347. self.assertEqual(self.user1.has_module_perms("app1"), False)
  348. self.assertEqual(self.user1.has_module_perms("app2"), False)
  349. class PermissionDeniedBackend(object):
  350. """
  351. Always raises PermissionDenied in `authenticate`, `has_perm` and `has_module_perms`.
  352. """
  353. supports_object_permissions = True
  354. supports_anonymous_user = True
  355. supports_inactive_user = True
  356. def authenticate(self, username=None, password=None):
  357. raise PermissionDenied
  358. def has_perm(self, user_obj, perm, obj=None):
  359. raise PermissionDenied
  360. def has_module_perms(self, user_obj, app_label):
  361. raise PermissionDenied
  362. class PermissionDeniedBackendTest(TestCase):
  363. """
  364. Tests that other backends are not checked once a backend raises PermissionDenied
  365. """
  366. backend = 'auth_tests.test_auth_backends.PermissionDeniedBackend'
  367. def setUp(self):
  368. self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
  369. self.user1.save()
  370. @modify_settings(AUTHENTICATION_BACKENDS={'prepend': backend})
  371. def test_permission_denied(self):
  372. "user is not authenticated after a backend raises permission denied #2550"
  373. self.assertEqual(authenticate(username='test', password='test'), None)
  374. @modify_settings(AUTHENTICATION_BACKENDS={'append': backend})
  375. def test_authenticates(self):
  376. self.assertEqual(authenticate(username='test', password='test'), self.user1)
  377. @modify_settings(AUTHENTICATION_BACKENDS={'prepend': backend})
  378. def test_has_perm_denied(self):
  379. content_type = ContentType.objects.get_for_model(Group)
  380. perm = Permission.objects.create(name='test', content_type=content_type, codename='test')
  381. self.user1.user_permissions.add(perm)
  382. self.assertIs(self.user1.has_perm('auth.test'), False)
  383. self.assertIs(self.user1.has_module_perms('auth'), False)
  384. @modify_settings(AUTHENTICATION_BACKENDS={'append': backend})
  385. def test_has_perm(self):
  386. content_type = ContentType.objects.get_for_model(Group)
  387. perm = Permission.objects.create(name='test', content_type=content_type, codename='test')
  388. self.user1.user_permissions.add(perm)
  389. self.assertIs(self.user1.has_perm('auth.test'), True)
  390. self.assertIs(self.user1.has_module_perms('auth'), True)
  391. class NewModelBackend(ModelBackend):
  392. pass
  393. class ChangedBackendSettingsTest(TestCase):
  394. """
  395. Tests for changes in the settings.AUTHENTICATION_BACKENDS
  396. """
  397. backend = 'auth_tests.test_auth_backends.NewModelBackend'
  398. TEST_USERNAME = 'test_user'
  399. TEST_PASSWORD = 'test_password'
  400. TEST_EMAIL = 'test@example.com'
  401. def setUp(self):
  402. User.objects.create_user(self.TEST_USERNAME,
  403. self.TEST_EMAIL,
  404. self.TEST_PASSWORD)
  405. @override_settings(AUTHENTICATION_BACKENDS=[backend])
  406. def test_changed_backend_settings(self):
  407. """
  408. Tests that removing a backend configured in AUTHENTICATION_BACKENDS
  409. make already logged-in users disconnect.
  410. """
  411. # Get a session for the test user
  412. self.assertTrue(self.client.login(
  413. username=self.TEST_USERNAME,
  414. password=self.TEST_PASSWORD)
  415. )
  416. # Prepare a request object
  417. request = HttpRequest()
  418. request.session = self.client.session
  419. # Remove NewModelBackend
  420. with self.settings(AUTHENTICATION_BACKENDS=[
  421. 'django.contrib.auth.backends.ModelBackend']):
  422. # Get the user from the request
  423. user = get_user(request)
  424. # Assert that the user retrieval is successful and the user is
  425. # anonymous as the backend is not longer available.
  426. self.assertIsNotNone(user)
  427. self.assertTrue(user.is_anonymous())
  428. class TypeErrorBackend(object):
  429. """
  430. Always raises TypeError.
  431. """
  432. supports_object_permissions = True
  433. supports_anonymous_user = True
  434. supports_inactive_user = True
  435. def authenticate(self, username=None, password=None):
  436. raise TypeError
  437. class TypeErrorBackendTest(TestCase):
  438. """
  439. Tests that a TypeError within a backend is propagated properly.
  440. Regression test for ticket #18171
  441. """
  442. backend = 'auth_tests.test_auth_backends.TypeErrorBackend'
  443. def setUp(self):
  444. self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
  445. @override_settings(AUTHENTICATION_BACKENDS=[backend])
  446. def test_type_error_raised(self):
  447. self.assertRaises(TypeError, authenticate, username='test', password='test')
  448. class ImproperlyConfiguredUserModelTest(TestCase):
  449. """
  450. Tests that an exception from within get_user_model is propagated and doesn't
  451. raise an UnboundLocalError.
  452. Regression test for ticket #21439
  453. """
  454. def setUp(self):
  455. self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
  456. self.client.login(
  457. username='test',
  458. password='test'
  459. )
  460. @override_settings(AUTH_USER_MODEL='thismodel.doesntexist')
  461. def test_does_not_shadow_exception(self):
  462. # Prepare a request object
  463. request = HttpRequest()
  464. request.session = self.client.session
  465. self.assertRaises(ImproperlyConfigured, get_user, request)
  466. class ImportedModelBackend(ModelBackend):
  467. pass
  468. class ImportedBackendTests(TestCase):
  469. """
  470. #23925 - The backend path added to the session should be the same
  471. as the one defined in AUTHENTICATION_BACKENDS setting.
  472. """
  473. backend = 'auth_tests.backend_alias.ImportedModelBackend'
  474. @override_settings(AUTHENTICATION_BACKENDS=[backend])
  475. def test_backend_path(self):
  476. username = 'username'
  477. password = 'password'
  478. User.objects.create_user(username, 'email', password)
  479. self.assertTrue(self.client.login(username=username, password=password))
  480. request = HttpRequest()
  481. request.session = self.client.session
  482. self.assertEqual(request.session[BACKEND_SESSION_KEY], self.backend)