test_auth_backends.py 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280
  1. import sys
  2. from datetime import date
  3. from unittest import mock
  4. from asgiref.sync import sync_to_async
  5. from django.contrib.auth import (
  6. BACKEND_SESSION_KEY,
  7. SESSION_KEY,
  8. _clean_credentials,
  9. aauthenticate,
  10. authenticate,
  11. get_user,
  12. signals,
  13. )
  14. from django.contrib.auth.backends import BaseBackend, ModelBackend
  15. from django.contrib.auth.hashers import MD5PasswordHasher
  16. from django.contrib.auth.models import AnonymousUser, Group, Permission, User
  17. from django.contrib.contenttypes.models import ContentType
  18. from django.core.exceptions import ImproperlyConfigured, PermissionDenied
  19. from django.http import HttpRequest
  20. from django.test import (
  21. RequestFactory,
  22. SimpleTestCase,
  23. TestCase,
  24. modify_settings,
  25. override_settings,
  26. )
  27. from django.views.debug import technical_500_response
  28. from django.views.decorators.debug import sensitive_variables
  29. from .models import (
  30. CustomPermissionsUser,
  31. CustomUser,
  32. CustomUserWithoutIsActiveField,
  33. ExtensionUser,
  34. UUIDUser,
  35. )
  36. class SimpleBackend(BaseBackend):
  37. def get_user_permissions(self, user_obj, obj=None):
  38. return ["user_perm"]
  39. def get_group_permissions(self, user_obj, obj=None):
  40. return ["group_perm"]
  41. @override_settings(
  42. AUTHENTICATION_BACKENDS=["auth_tests.test_auth_backends.SimpleBackend"]
  43. )
  44. class BaseBackendTest(TestCase):
  45. @classmethod
  46. def setUpTestData(cls):
  47. cls.user = User.objects.create_user("test", "test@example.com", "test")
  48. def test_get_user_permissions(self):
  49. self.assertEqual(self.user.get_user_permissions(), {"user_perm"})
  50. async def test_aget_user_permissions(self):
  51. self.assertEqual(await self.user.aget_user_permissions(), {"user_perm"})
  52. def test_get_group_permissions(self):
  53. self.assertEqual(self.user.get_group_permissions(), {"group_perm"})
  54. async def test_aget_group_permissions(self):
  55. self.assertEqual(await self.user.aget_group_permissions(), {"group_perm"})
  56. def test_get_all_permissions(self):
  57. self.assertEqual(self.user.get_all_permissions(), {"user_perm", "group_perm"})
  58. async def test_aget_all_permissions(self):
  59. self.assertEqual(
  60. await self.user.aget_all_permissions(), {"user_perm", "group_perm"}
  61. )
  62. def test_has_perm(self):
  63. self.assertIs(self.user.has_perm("user_perm"), True)
  64. self.assertIs(self.user.has_perm("group_perm"), True)
  65. self.assertIs(self.user.has_perm("other_perm", TestObj()), False)
  66. async def test_ahas_perm(self):
  67. self.assertIs(await self.user.ahas_perm("user_perm"), True)
  68. self.assertIs(await self.user.ahas_perm("group_perm"), True)
  69. self.assertIs(await self.user.ahas_perm("other_perm", TestObj()), False)
  70. def test_has_perms_perm_list_invalid(self):
  71. msg = "perm_list must be an iterable of permissions."
  72. with self.assertRaisesMessage(ValueError, msg):
  73. self.user.has_perms("user_perm")
  74. with self.assertRaisesMessage(ValueError, msg):
  75. self.user.has_perms(object())
  76. async def test_ahas_perms_perm_list_invalid(self):
  77. msg = "perm_list must be an iterable of permissions."
  78. with self.assertRaisesMessage(ValueError, msg):
  79. await self.user.ahas_perms("user_perm")
  80. with self.assertRaisesMessage(ValueError, msg):
  81. await self.user.ahas_perms(object())
  82. class CountingMD5PasswordHasher(MD5PasswordHasher):
  83. """Hasher that counts how many times it computes a hash."""
  84. calls = 0
  85. def encode(self, *args, **kwargs):
  86. type(self).calls += 1
  87. return super().encode(*args, **kwargs)
  88. class BaseModelBackendTest:
  89. """
  90. A base class for tests that need to validate the ModelBackend
  91. with different User models. Subclasses should define a class
  92. level UserModel attribute, and a create_users() method to
  93. construct two users for test purposes.
  94. """
  95. backend = "django.contrib.auth.backends.ModelBackend"
  96. @classmethod
  97. def setUpClass(cls):
  98. cls.enterClassContext(
  99. modify_settings(AUTHENTICATION_BACKENDS={"append": cls.backend})
  100. )
  101. super().setUpClass()
  102. def setUp(self):
  103. # The custom_perms test messes with ContentTypes, which will be cached.
  104. # Flush the cache to ensure there are no side effects.
  105. self.addCleanup(ContentType.objects.clear_cache)
  106. self.create_users()
  107. def test_has_perm(self):
  108. user = self.UserModel._default_manager.get(pk=self.user.pk)
  109. self.assertIs(user.has_perm("auth.test"), False)
  110. user.is_staff = True
  111. user.save()
  112. self.assertIs(user.has_perm("auth.test"), False)
  113. user.is_superuser = True
  114. user.save()
  115. self.assertIs(user.has_perm("auth.test"), True)
  116. user.is_staff = True
  117. user.is_superuser = True
  118. user.is_active = False
  119. user.save()
  120. self.assertIs(user.has_perm("auth.test"), False)
  121. async def test_ahas_perm(self):
  122. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  123. self.assertIs(await user.ahas_perm("auth.test"), False)
  124. user.is_staff = True
  125. await user.asave()
  126. self.assertIs(await user.ahas_perm("auth.test"), False)
  127. user.is_superuser = True
  128. await user.asave()
  129. self.assertIs(await user.ahas_perm("auth.test"), True)
  130. self.assertIs(await user.ahas_module_perms("auth"), True)
  131. user.is_staff = True
  132. user.is_superuser = True
  133. user.is_active = False
  134. await user.asave()
  135. self.assertIs(await user.ahas_perm("auth.test"), False)
  136. def test_custom_perms(self):
  137. user = self.UserModel._default_manager.get(pk=self.user.pk)
  138. content_type = ContentType.objects.get_for_model(Group)
  139. perm = Permission.objects.create(
  140. name="test", content_type=content_type, codename="test"
  141. )
  142. user.user_permissions.add(perm)
  143. # reloading user to purge the _perm_cache
  144. user = self.UserModel._default_manager.get(pk=self.user.pk)
  145. self.assertEqual(user.get_all_permissions(), {"auth.test"})
  146. self.assertEqual(user.get_user_permissions(), {"auth.test"})
  147. self.assertEqual(user.get_group_permissions(), set())
  148. self.assertIs(user.has_module_perms("Group"), False)
  149. self.assertIs(user.has_module_perms("auth"), True)
  150. perm = Permission.objects.create(
  151. name="test2", content_type=content_type, codename="test2"
  152. )
  153. user.user_permissions.add(perm)
  154. perm = Permission.objects.create(
  155. name="test3", content_type=content_type, codename="test3"
  156. )
  157. user.user_permissions.add(perm)
  158. user = self.UserModel._default_manager.get(pk=self.user.pk)
  159. expected_user_perms = {"auth.test2", "auth.test", "auth.test3"}
  160. self.assertEqual(user.get_all_permissions(), expected_user_perms)
  161. self.assertIs(user.has_perm("test"), False)
  162. self.assertIs(user.has_perm("auth.test"), True)
  163. self.assertIs(user.has_perms(["auth.test2", "auth.test3"]), True)
  164. perm = Permission.objects.create(
  165. name="test_group", content_type=content_type, codename="test_group"
  166. )
  167. group = Group.objects.create(name="test_group")
  168. group.permissions.add(perm)
  169. user.groups.add(group)
  170. user = self.UserModel._default_manager.get(pk=self.user.pk)
  171. self.assertEqual(
  172. user.get_all_permissions(), {*expected_user_perms, "auth.test_group"}
  173. )
  174. self.assertEqual(user.get_user_permissions(), expected_user_perms)
  175. self.assertEqual(user.get_group_permissions(), {"auth.test_group"})
  176. self.assertIs(user.has_perms(["auth.test3", "auth.test_group"]), True)
  177. user = AnonymousUser()
  178. self.assertIs(user.has_perm("test"), False)
  179. self.assertIs(user.has_perms(["auth.test2", "auth.test3"]), False)
  180. async def test_acustom_perms(self):
  181. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  182. content_type = await sync_to_async(ContentType.objects.get_for_model)(Group)
  183. perm = await Permission.objects.acreate(
  184. name="test", content_type=content_type, codename="test"
  185. )
  186. await user.user_permissions.aadd(perm)
  187. # Reloading user to purge the _perm_cache.
  188. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  189. self.assertEqual(await user.aget_all_permissions(), {"auth.test"})
  190. self.assertEqual(await user.aget_user_permissions(), {"auth.test"})
  191. self.assertEqual(await user.aget_group_permissions(), set())
  192. self.assertIs(await user.ahas_module_perms("Group"), False)
  193. self.assertIs(await user.ahas_module_perms("auth"), True)
  194. perm = await Permission.objects.acreate(
  195. name="test2", content_type=content_type, codename="test2"
  196. )
  197. await user.user_permissions.aadd(perm)
  198. perm = await Permission.objects.acreate(
  199. name="test3", content_type=content_type, codename="test3"
  200. )
  201. await user.user_permissions.aadd(perm)
  202. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  203. expected_user_perms = {"auth.test2", "auth.test", "auth.test3"}
  204. self.assertEqual(await user.aget_all_permissions(), expected_user_perms)
  205. self.assertIs(await user.ahas_perm("test"), False)
  206. self.assertIs(await user.ahas_perm("auth.test"), True)
  207. self.assertIs(await user.ahas_perms(["auth.test2", "auth.test3"]), True)
  208. perm = await Permission.objects.acreate(
  209. name="test_group", content_type=content_type, codename="test_group"
  210. )
  211. group = await Group.objects.acreate(name="test_group")
  212. await group.permissions.aadd(perm)
  213. await user.groups.aadd(group)
  214. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  215. self.assertEqual(
  216. await user.aget_all_permissions(), {*expected_user_perms, "auth.test_group"}
  217. )
  218. self.assertEqual(await user.aget_user_permissions(), expected_user_perms)
  219. self.assertEqual(await user.aget_group_permissions(), {"auth.test_group"})
  220. self.assertIs(await user.ahas_perms(["auth.test3", "auth.test_group"]), True)
  221. user = AnonymousUser()
  222. self.assertIs(await user.ahas_perm("test"), False)
  223. self.assertIs(await user.ahas_perms(["auth.test2", "auth.test3"]), False)
  224. def test_has_no_object_perm(self):
  225. """Regressiontest for #12462"""
  226. user = self.UserModel._default_manager.get(pk=self.user.pk)
  227. content_type = ContentType.objects.get_for_model(Group)
  228. perm = Permission.objects.create(
  229. name="test", content_type=content_type, codename="test"
  230. )
  231. user.user_permissions.add(perm)
  232. self.assertIs(user.has_perm("auth.test", "object"), False)
  233. self.assertEqual(user.get_all_permissions("object"), set())
  234. self.assertIs(user.has_perm("auth.test"), True)
  235. self.assertEqual(user.get_all_permissions(), {"auth.test"})
  236. async def test_ahas_no_object_perm(self):
  237. """See test_has_no_object_perm()"""
  238. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  239. content_type = await sync_to_async(ContentType.objects.get_for_model)(Group)
  240. perm = await Permission.objects.acreate(
  241. name="test", content_type=content_type, codename="test"
  242. )
  243. await user.user_permissions.aadd(perm)
  244. self.assertIs(await user.ahas_perm("auth.test", "object"), False)
  245. self.assertEqual(await user.aget_all_permissions("object"), set())
  246. self.assertIs(await user.ahas_perm("auth.test"), True)
  247. self.assertEqual(await user.aget_all_permissions(), {"auth.test"})
  248. def test_anonymous_has_no_permissions(self):
  249. """
  250. #17903 -- Anonymous users shouldn't have permissions in
  251. ModelBackend.get_(all|user|group)_permissions().
  252. """
  253. backend = ModelBackend()
  254. user = self.UserModel._default_manager.get(pk=self.user.pk)
  255. content_type = ContentType.objects.get_for_model(Group)
  256. user_perm = Permission.objects.create(
  257. name="test", content_type=content_type, codename="test_user"
  258. )
  259. group_perm = Permission.objects.create(
  260. name="test2", content_type=content_type, codename="test_group"
  261. )
  262. user.user_permissions.add(user_perm)
  263. group = Group.objects.create(name="test_group")
  264. user.groups.add(group)
  265. group.permissions.add(group_perm)
  266. self.assertEqual(
  267. backend.get_all_permissions(user), {"auth.test_user", "auth.test_group"}
  268. )
  269. self.assertEqual(backend.get_user_permissions(user), {"auth.test_user"})
  270. self.assertEqual(backend.get_group_permissions(user), {"auth.test_group"})
  271. with mock.patch.object(self.UserModel, "is_anonymous", True):
  272. self.assertEqual(backend.get_all_permissions(user), set())
  273. self.assertEqual(backend.get_user_permissions(user), set())
  274. self.assertEqual(backend.get_group_permissions(user), set())
  275. async def test_aanonymous_has_no_permissions(self):
  276. """See test_anonymous_has_no_permissions()"""
  277. backend = ModelBackend()
  278. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  279. content_type = await sync_to_async(ContentType.objects.get_for_model)(Group)
  280. user_perm = await Permission.objects.acreate(
  281. name="test", content_type=content_type, codename="test_user"
  282. )
  283. group_perm = await Permission.objects.acreate(
  284. name="test2", content_type=content_type, codename="test_group"
  285. )
  286. await user.user_permissions.aadd(user_perm)
  287. group = await Group.objects.acreate(name="test_group")
  288. await user.groups.aadd(group)
  289. await group.permissions.aadd(group_perm)
  290. self.assertEqual(
  291. await backend.aget_all_permissions(user),
  292. {"auth.test_user", "auth.test_group"},
  293. )
  294. self.assertEqual(await backend.aget_user_permissions(user), {"auth.test_user"})
  295. self.assertEqual(
  296. await backend.aget_group_permissions(user), {"auth.test_group"}
  297. )
  298. with mock.patch.object(self.UserModel, "is_anonymous", True):
  299. self.assertEqual(await backend.aget_all_permissions(user), set())
  300. self.assertEqual(await backend.aget_user_permissions(user), set())
  301. self.assertEqual(await backend.aget_group_permissions(user), set())
  302. def test_inactive_has_no_permissions(self):
  303. """
  304. #17903 -- Inactive users shouldn't have permissions in
  305. ModelBackend.get_(all|user|group)_permissions().
  306. """
  307. backend = ModelBackend()
  308. user = self.UserModel._default_manager.get(pk=self.user.pk)
  309. content_type = ContentType.objects.get_for_model(Group)
  310. user_perm = Permission.objects.create(
  311. name="test", content_type=content_type, codename="test_user"
  312. )
  313. group_perm = Permission.objects.create(
  314. name="test2", content_type=content_type, codename="test_group"
  315. )
  316. user.user_permissions.add(user_perm)
  317. group = Group.objects.create(name="test_group")
  318. user.groups.add(group)
  319. group.permissions.add(group_perm)
  320. self.assertEqual(
  321. backend.get_all_permissions(user), {"auth.test_user", "auth.test_group"}
  322. )
  323. self.assertEqual(backend.get_user_permissions(user), {"auth.test_user"})
  324. self.assertEqual(backend.get_group_permissions(user), {"auth.test_group"})
  325. user.is_active = False
  326. user.save()
  327. self.assertEqual(backend.get_all_permissions(user), set())
  328. self.assertEqual(backend.get_user_permissions(user), set())
  329. self.assertEqual(backend.get_group_permissions(user), set())
  330. async def test_ainactive_has_no_permissions(self):
  331. """See test_inactive_has_no_permissions()"""
  332. backend = ModelBackend()
  333. user = await self.UserModel._default_manager.aget(pk=self.user.pk)
  334. content_type = await sync_to_async(ContentType.objects.get_for_model)(Group)
  335. user_perm = await Permission.objects.acreate(
  336. name="test", content_type=content_type, codename="test_user"
  337. )
  338. group_perm = await Permission.objects.acreate(
  339. name="test2", content_type=content_type, codename="test_group"
  340. )
  341. await user.user_permissions.aadd(user_perm)
  342. group = await Group.objects.acreate(name="test_group")
  343. await user.groups.aadd(group)
  344. await group.permissions.aadd(group_perm)
  345. self.assertEqual(
  346. await backend.aget_all_permissions(user),
  347. {"auth.test_user", "auth.test_group"},
  348. )
  349. self.assertEqual(await backend.aget_user_permissions(user), {"auth.test_user"})
  350. self.assertEqual(
  351. await backend.aget_group_permissions(user), {"auth.test_group"}
  352. )
  353. user.is_active = False
  354. await user.asave()
  355. self.assertEqual(await backend.aget_all_permissions(user), set())
  356. self.assertEqual(await backend.aget_user_permissions(user), set())
  357. self.assertEqual(await backend.aget_group_permissions(user), set())
  358. def test_get_all_superuser_permissions(self):
  359. """A superuser has all permissions. Refs #14795."""
  360. user = self.UserModel._default_manager.get(pk=self.superuser.pk)
  361. self.assertEqual(len(user.get_all_permissions()), len(Permission.objects.all()))
  362. async def test_aget_all_superuser_permissions(self):
  363. """See test_get_all_superuser_permissions()"""
  364. user = await self.UserModel._default_manager.aget(pk=self.superuser.pk)
  365. self.assertEqual(
  366. len(await user.aget_all_permissions()), await Permission.objects.acount()
  367. )
  368. @override_settings(
  369. PASSWORD_HASHERS=["auth_tests.test_auth_backends.CountingMD5PasswordHasher"]
  370. )
  371. def test_authentication_timing(self):
  372. """Hasher is run once regardless of whether the user exists. Refs #20760."""
  373. # Re-set the password, because this tests overrides PASSWORD_HASHERS
  374. self.user.set_password("test")
  375. self.user.save()
  376. CountingMD5PasswordHasher.calls = 0
  377. username = getattr(self.user, self.UserModel.USERNAME_FIELD)
  378. authenticate(username=username, password="test")
  379. self.assertEqual(CountingMD5PasswordHasher.calls, 1)
  380. CountingMD5PasswordHasher.calls = 0
  381. authenticate(username="no_such_user", password="test")
  382. self.assertEqual(CountingMD5PasswordHasher.calls, 1)
  383. @override_settings(
  384. PASSWORD_HASHERS=["auth_tests.test_auth_backends.CountingMD5PasswordHasher"]
  385. )
  386. async def test_aauthentication_timing(self):
  387. """See test_authentication_timing()"""
  388. # Re-set the password, because this tests overrides PASSWORD_HASHERS.
  389. self.user.set_password("test")
  390. await self.user.asave()
  391. CountingMD5PasswordHasher.calls = 0
  392. username = getattr(self.user, self.UserModel.USERNAME_FIELD)
  393. await aauthenticate(username=username, password="test")
  394. self.assertEqual(CountingMD5PasswordHasher.calls, 1)
  395. CountingMD5PasswordHasher.calls = 0
  396. await aauthenticate(username="no_such_user", password="test")
  397. self.assertEqual(CountingMD5PasswordHasher.calls, 1)
  398. @override_settings(
  399. PASSWORD_HASHERS=["auth_tests.test_auth_backends.CountingMD5PasswordHasher"]
  400. )
  401. def test_authentication_without_credentials(self):
  402. CountingMD5PasswordHasher.calls = 0
  403. for credentials in (
  404. {},
  405. {"username": getattr(self.user, self.UserModel.USERNAME_FIELD)},
  406. {"password": "test"},
  407. ):
  408. with self.subTest(credentials=credentials):
  409. with self.assertNumQueries(0):
  410. authenticate(**credentials)
  411. self.assertEqual(CountingMD5PasswordHasher.calls, 0)
  412. class ModelBackendTest(BaseModelBackendTest, TestCase):
  413. """
  414. Tests for the ModelBackend using the default User model.
  415. """
  416. UserModel = User
  417. user_credentials = {"username": "test", "password": "test"}
  418. def create_users(self):
  419. self.user = User.objects.create_user(
  420. email="test@example.com", **self.user_credentials
  421. )
  422. self.superuser = User.objects.create_superuser(
  423. username="test2",
  424. email="test2@example.com",
  425. password="test",
  426. )
  427. def test_authenticate_inactive(self):
  428. """
  429. An inactive user can't authenticate.
  430. """
  431. self.assertEqual(authenticate(**self.user_credentials), self.user)
  432. self.user.is_active = False
  433. self.user.save()
  434. self.assertIsNone(authenticate(**self.user_credentials))
  435. async def test_aauthenticate_inactive(self):
  436. """
  437. An inactive user can't authenticate.
  438. """
  439. self.assertEqual(await aauthenticate(**self.user_credentials), self.user)
  440. self.user.is_active = False
  441. await self.user.asave()
  442. self.assertIsNone(await aauthenticate(**self.user_credentials))
  443. @override_settings(AUTH_USER_MODEL="auth_tests.CustomUserWithoutIsActiveField")
  444. def test_authenticate_user_without_is_active_field(self):
  445. """
  446. A custom user without an `is_active` field is allowed to authenticate.
  447. """
  448. user = CustomUserWithoutIsActiveField.objects._create_user(
  449. username="test",
  450. email="test@example.com",
  451. password="test",
  452. )
  453. self.assertEqual(authenticate(username="test", password="test"), user)
  454. @override_settings(AUTH_USER_MODEL="auth_tests.CustomUserWithoutIsActiveField")
  455. async def test_aauthenticate_user_without_is_active_field(self):
  456. """
  457. A custom user without an `is_active` field is allowed to authenticate.
  458. """
  459. user = await CustomUserWithoutIsActiveField.objects._acreate_user(
  460. username="test",
  461. email="test@example.com",
  462. password="test",
  463. )
  464. self.assertEqual(await aauthenticate(username="test", password="test"), user)
  465. @override_settings(AUTH_USER_MODEL="auth_tests.ExtensionUser")
  466. class ExtensionUserModelBackendTest(BaseModelBackendTest, TestCase):
  467. """
  468. Tests for the ModelBackend using the custom ExtensionUser model.
  469. This isn't a perfect test, because both the User and ExtensionUser are
  470. synchronized to the database, which wouldn't ordinary happen in
  471. production. As a result, it doesn't catch errors caused by the non-
  472. existence of the User table.
  473. The specific problem is queries on .filter(groups__user) et al, which
  474. makes an implicit assumption that the user model is called 'User'. In
  475. production, the auth.User table won't exist, so the requested join
  476. won't exist either; in testing, the auth.User *does* exist, and
  477. so does the join. However, the join table won't contain any useful
  478. data; for testing, we check that the data we expect actually does exist.
  479. """
  480. UserModel = ExtensionUser
  481. def create_users(self):
  482. self.user = ExtensionUser._default_manager.create_user(
  483. username="test",
  484. email="test@example.com",
  485. password="test",
  486. date_of_birth=date(2006, 4, 25),
  487. )
  488. self.superuser = ExtensionUser._default_manager.create_superuser(
  489. username="test2",
  490. email="test2@example.com",
  491. password="test",
  492. date_of_birth=date(1976, 11, 8),
  493. )
  494. @override_settings(AUTH_USER_MODEL="auth_tests.CustomPermissionsUser")
  495. class CustomPermissionsUserModelBackendTest(BaseModelBackendTest, TestCase):
  496. """
  497. Tests for the ModelBackend using the CustomPermissionsUser model.
  498. As with the ExtensionUser test, this isn't a perfect test, because both
  499. the User and CustomPermissionsUser are synchronized to the database,
  500. which wouldn't ordinary happen in production.
  501. """
  502. UserModel = CustomPermissionsUser
  503. def create_users(self):
  504. self.user = CustomPermissionsUser._default_manager.create_user(
  505. email="test@example.com", password="test", date_of_birth=date(2006, 4, 25)
  506. )
  507. self.superuser = CustomPermissionsUser._default_manager.create_superuser(
  508. email="test2@example.com", password="test", date_of_birth=date(1976, 11, 8)
  509. )
  510. @override_settings(AUTH_USER_MODEL="auth_tests.CustomUser")
  511. class CustomUserModelBackendAuthenticateTest(TestCase):
  512. """
  513. The model backend can accept a credentials kwarg labeled with
  514. custom user model's USERNAME_FIELD.
  515. """
  516. def test_authenticate(self):
  517. test_user = CustomUser._default_manager.create_user(
  518. email="test@example.com", password="test", date_of_birth=date(2006, 4, 25)
  519. )
  520. authenticated_user = authenticate(email="test@example.com", password="test")
  521. self.assertEqual(test_user, authenticated_user)
  522. async def test_aauthenticate(self):
  523. test_user = await CustomUser._default_manager.acreate_user(
  524. email="test@example.com", password="test", date_of_birth=date(2006, 4, 25)
  525. )
  526. authenticated_user = await aauthenticate(
  527. email="test@example.com", password="test"
  528. )
  529. self.assertEqual(test_user, authenticated_user)
  530. @override_settings(AUTH_USER_MODEL="auth_tests.UUIDUser")
  531. class UUIDUserTests(TestCase):
  532. def test_login(self):
  533. """
  534. A custom user with a UUID primary key should be able to login.
  535. """
  536. user = UUIDUser.objects.create_user(username="uuid", password="test")
  537. self.assertTrue(self.client.login(username="uuid", password="test"))
  538. self.assertEqual(
  539. UUIDUser.objects.get(pk=self.client.session[SESSION_KEY]), user
  540. )
  541. async def test_alogin(self):
  542. """See test_login()"""
  543. user = await UUIDUser.objects.acreate_user(username="uuid", password="test")
  544. self.assertTrue(await self.client.alogin(username="uuid", password="test"))
  545. session_key = await self.client.session.aget(SESSION_KEY)
  546. self.assertEqual(await UUIDUser.objects.aget(pk=session_key), user)
  547. class TestObj:
  548. pass
  549. class SimpleRowlevelBackend:
  550. def has_perm(self, user, perm, obj=None):
  551. if not obj:
  552. return # We only support row level perms
  553. if isinstance(obj, TestObj):
  554. if user.username == "test2":
  555. return True
  556. elif user.is_anonymous and perm == "anon":
  557. return True
  558. elif not user.is_active and perm == "inactive":
  559. return True
  560. return False
  561. async def ahas_perm(self, user, perm, obj=None):
  562. return self.has_perm(user, perm, obj)
  563. def has_module_perms(self, user, app_label):
  564. return (user.is_anonymous or user.is_active) and app_label == "app1"
  565. async def ahas_module_perms(self, user, app_label):
  566. return self.has_module_perms(user, app_label)
  567. def get_all_permissions(self, user, obj=None):
  568. if not obj:
  569. return [] # We only support row level perms
  570. if not isinstance(obj, TestObj):
  571. return ["none"]
  572. if user.is_anonymous:
  573. return ["anon"]
  574. if user.username == "test2":
  575. return ["simple", "advanced"]
  576. else:
  577. return ["simple"]
  578. async def aget_all_permissions(self, user, obj=None):
  579. return self.get_all_permissions(user, obj)
  580. def get_group_permissions(self, user, obj=None):
  581. if not obj:
  582. return # We only support row level perms
  583. if not isinstance(obj, TestObj):
  584. return ["none"]
  585. if "test_group" in [group.name for group in user.groups.all()]:
  586. return ["group_perm"]
  587. else:
  588. return ["none"]
  589. @modify_settings(
  590. AUTHENTICATION_BACKENDS={
  591. "append": "auth_tests.test_auth_backends.SimpleRowlevelBackend",
  592. }
  593. )
  594. class RowlevelBackendTest(TestCase):
  595. """
  596. Tests for auth backend that supports object level permissions
  597. """
  598. @classmethod
  599. def setUpTestData(cls):
  600. cls.user1 = User.objects.create_user("test", "test@example.com", "test")
  601. cls.user2 = User.objects.create_user("test2", "test2@example.com", "test")
  602. cls.user3 = User.objects.create_user("test3", "test3@example.com", "test")
  603. def tearDown(self):
  604. # The get_group_permissions test messes with ContentTypes, which will
  605. # be cached; flush the cache to ensure there are no side effects
  606. # Refs #14975, #14925
  607. ContentType.objects.clear_cache()
  608. def test_has_perm(self):
  609. self.assertIs(self.user1.has_perm("perm", TestObj()), False)
  610. self.assertIs(self.user2.has_perm("perm", TestObj()), True)
  611. self.assertIs(self.user2.has_perm("perm"), False)
  612. self.assertIs(self.user2.has_perms(["simple", "advanced"], TestObj()), True)
  613. self.assertIs(self.user3.has_perm("perm", TestObj()), False)
  614. self.assertIs(self.user3.has_perm("anon", TestObj()), False)
  615. self.assertIs(self.user3.has_perms(["simple", "advanced"], TestObj()), False)
  616. def test_get_all_permissions(self):
  617. self.assertEqual(self.user1.get_all_permissions(TestObj()), {"simple"})
  618. self.assertEqual(
  619. self.user2.get_all_permissions(TestObj()), {"simple", "advanced"}
  620. )
  621. self.assertEqual(self.user2.get_all_permissions(), set())
  622. def test_get_group_permissions(self):
  623. group = Group.objects.create(name="test_group")
  624. self.user3.groups.add(group)
  625. self.assertEqual(self.user3.get_group_permissions(TestObj()), {"group_perm"})
  626. @override_settings(
  627. AUTHENTICATION_BACKENDS=["auth_tests.test_auth_backends.SimpleRowlevelBackend"],
  628. )
  629. class AnonymousUserBackendTest(SimpleTestCase):
  630. """
  631. Tests for AnonymousUser delegating to backend.
  632. """
  633. def setUp(self):
  634. self.user1 = AnonymousUser()
  635. def test_has_perm(self):
  636. self.assertIs(self.user1.has_perm("perm", TestObj()), False)
  637. self.assertIs(self.user1.has_perm("anon", TestObj()), True)
  638. async def test_ahas_perm(self):
  639. self.assertIs(await self.user1.ahas_perm("perm", TestObj()), False)
  640. self.assertIs(await self.user1.ahas_perm("anon", TestObj()), True)
  641. def test_has_perms(self):
  642. self.assertIs(self.user1.has_perms(["anon"], TestObj()), True)
  643. self.assertIs(self.user1.has_perms(["anon", "perm"], TestObj()), False)
  644. async def test_ahas_perms(self):
  645. self.assertIs(await self.user1.ahas_perms(["anon"], TestObj()), True)
  646. self.assertIs(await self.user1.ahas_perms(["anon", "perm"], TestObj()), False)
  647. def test_has_perms_perm_list_invalid(self):
  648. msg = "perm_list must be an iterable of permissions."
  649. with self.assertRaisesMessage(ValueError, msg):
  650. self.user1.has_perms("perm")
  651. with self.assertRaisesMessage(ValueError, msg):
  652. self.user1.has_perms(object())
  653. async def test_ahas_perms_perm_list_invalid(self):
  654. msg = "perm_list must be an iterable of permissions."
  655. with self.assertRaisesMessage(ValueError, msg):
  656. await self.user1.ahas_perms("perm")
  657. with self.assertRaisesMessage(ValueError, msg):
  658. await self.user1.ahas_perms(object())
  659. def test_has_module_perms(self):
  660. self.assertIs(self.user1.has_module_perms("app1"), True)
  661. self.assertIs(self.user1.has_module_perms("app2"), False)
  662. async def test_ahas_module_perms(self):
  663. self.assertIs(await self.user1.ahas_module_perms("app1"), True)
  664. self.assertIs(await self.user1.ahas_module_perms("app2"), False)
  665. def test_get_all_permissions(self):
  666. self.assertEqual(self.user1.get_all_permissions(TestObj()), {"anon"})
  667. async def test_aget_all_permissions(self):
  668. self.assertEqual(await self.user1.aget_all_permissions(TestObj()), {"anon"})
  669. @override_settings(AUTHENTICATION_BACKENDS=[])
  670. class NoBackendsTest(TestCase):
  671. """
  672. An appropriate error is raised if no auth backends are provided.
  673. """
  674. @classmethod
  675. def setUpTestData(cls):
  676. cls.user = User.objects.create_user("test", "test@example.com", "test")
  677. def test_raises_exception(self):
  678. msg = (
  679. "No authentication backends have been defined. "
  680. "Does AUTHENTICATION_BACKENDS contain anything?"
  681. )
  682. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  683. self.user.has_perm(("perm", TestObj()))
  684. async def test_araises_exception(self):
  685. msg = (
  686. "No authentication backends have been defined. "
  687. "Does AUTHENTICATION_BACKENDS contain anything?"
  688. )
  689. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  690. await self.user.ahas_perm(("perm", TestObj()))
  691. @override_settings(
  692. AUTHENTICATION_BACKENDS=["auth_tests.test_auth_backends.SimpleRowlevelBackend"]
  693. )
  694. class InActiveUserBackendTest(TestCase):
  695. """
  696. Tests for an inactive user
  697. """
  698. @classmethod
  699. def setUpTestData(cls):
  700. cls.user1 = User.objects.create_user("test", "test@example.com", "test")
  701. cls.user1.is_active = False
  702. cls.user1.save()
  703. def test_has_perm(self):
  704. self.assertIs(self.user1.has_perm("perm", TestObj()), False)
  705. self.assertIs(self.user1.has_perm("inactive", TestObj()), True)
  706. def test_has_module_perms(self):
  707. self.assertIs(self.user1.has_module_perms("app1"), False)
  708. self.assertIs(self.user1.has_module_perms("app2"), False)
  709. class PermissionDeniedBackend:
  710. """
  711. Always raises PermissionDenied in `authenticate`, `has_perm` and `has_module_perms`.
  712. """
  713. def authenticate(self, request, username=None, password=None):
  714. raise PermissionDenied
  715. async def aauthenticate(self, request, username=None, password=None):
  716. raise PermissionDenied
  717. def has_perm(self, user_obj, perm, obj=None):
  718. raise PermissionDenied
  719. async def ahas_perm(self, user_obj, perm, obj=None):
  720. raise PermissionDenied
  721. def has_module_perms(self, user_obj, app_label):
  722. raise PermissionDenied
  723. async def ahas_module_perms(self, user_obj, app_label):
  724. raise PermissionDenied
  725. class PermissionDeniedBackendTest(TestCase):
  726. """
  727. Other backends are not checked once a backend raises PermissionDenied
  728. """
  729. backend = "auth_tests.test_auth_backends.PermissionDeniedBackend"
  730. @classmethod
  731. def setUpTestData(cls):
  732. cls.user1 = User.objects.create_user("test", "test@example.com", "test")
  733. def setUp(self):
  734. self.user_login_failed = []
  735. signals.user_login_failed.connect(self.user_login_failed_listener)
  736. self.addCleanup(
  737. signals.user_login_failed.disconnect, self.user_login_failed_listener
  738. )
  739. def user_login_failed_listener(self, sender, credentials, **kwargs):
  740. self.user_login_failed.append(credentials)
  741. @modify_settings(AUTHENTICATION_BACKENDS={"prepend": backend})
  742. def test_permission_denied(self):
  743. "user is not authenticated after a backend raises permission denied #2550"
  744. self.assertIsNone(authenticate(username="test", password="test"))
  745. # user_login_failed signal is sent.
  746. self.assertEqual(
  747. self.user_login_failed,
  748. [{"password": "********************", "username": "test"}],
  749. )
  750. @modify_settings(AUTHENTICATION_BACKENDS={"prepend": backend})
  751. async def test_aauthenticate_permission_denied(self):
  752. self.assertIsNone(await aauthenticate(username="test", password="test"))
  753. # user_login_failed signal is sent.
  754. self.assertEqual(
  755. self.user_login_failed,
  756. [{"password": "********************", "username": "test"}],
  757. )
  758. @modify_settings(AUTHENTICATION_BACKENDS={"append": backend})
  759. def test_authenticates(self):
  760. self.assertEqual(authenticate(username="test", password="test"), self.user1)
  761. @modify_settings(AUTHENTICATION_BACKENDS={"append": backend})
  762. async def test_aauthenticate(self):
  763. self.assertEqual(
  764. await aauthenticate(username="test", password="test"), self.user1
  765. )
  766. @modify_settings(AUTHENTICATION_BACKENDS={"prepend": backend})
  767. def test_has_perm_denied(self):
  768. content_type = ContentType.objects.get_for_model(Group)
  769. perm = Permission.objects.create(
  770. name="test", content_type=content_type, codename="test"
  771. )
  772. self.user1.user_permissions.add(perm)
  773. self.assertIs(self.user1.has_perm("auth.test"), False)
  774. self.assertIs(self.user1.has_module_perms("auth"), False)
  775. @modify_settings(AUTHENTICATION_BACKENDS={"prepend": backend})
  776. async def test_ahas_perm_denied(self):
  777. content_type = await sync_to_async(ContentType.objects.get_for_model)(Group)
  778. perm = await Permission.objects.acreate(
  779. name="test", content_type=content_type, codename="test"
  780. )
  781. await self.user1.user_permissions.aadd(perm)
  782. self.assertIs(await self.user1.ahas_perm("auth.test"), False)
  783. self.assertIs(await self.user1.ahas_module_perms("auth"), False)
  784. @modify_settings(AUTHENTICATION_BACKENDS={"append": backend})
  785. def test_has_perm(self):
  786. content_type = ContentType.objects.get_for_model(Group)
  787. perm = Permission.objects.create(
  788. name="test", content_type=content_type, codename="test"
  789. )
  790. self.user1.user_permissions.add(perm)
  791. self.assertIs(self.user1.has_perm("auth.test"), True)
  792. self.assertIs(self.user1.has_module_perms("auth"), True)
  793. @modify_settings(AUTHENTICATION_BACKENDS={"append": backend})
  794. async def test_ahas_perm(self):
  795. content_type = await sync_to_async(ContentType.objects.get_for_model)(Group)
  796. perm = await Permission.objects.acreate(
  797. name="test", content_type=content_type, codename="test"
  798. )
  799. await self.user1.user_permissions.aadd(perm)
  800. self.assertIs(await self.user1.ahas_perm("auth.test"), True)
  801. self.assertIs(await self.user1.ahas_module_perms("auth"), True)
  802. class NewModelBackend(ModelBackend):
  803. pass
  804. class ChangedBackendSettingsTest(TestCase):
  805. """
  806. Tests for changes in the settings.AUTHENTICATION_BACKENDS
  807. """
  808. backend = "auth_tests.test_auth_backends.NewModelBackend"
  809. TEST_USERNAME = "test_user"
  810. TEST_PASSWORD = "test_password"
  811. TEST_EMAIL = "test@example.com"
  812. @classmethod
  813. def setUpTestData(cls):
  814. User.objects.create_user(cls.TEST_USERNAME, cls.TEST_EMAIL, cls.TEST_PASSWORD)
  815. @override_settings(AUTHENTICATION_BACKENDS=[backend])
  816. def test_changed_backend_settings(self):
  817. """
  818. Removing a backend configured in AUTHENTICATION_BACKENDS makes already
  819. logged-in users disconnect.
  820. """
  821. # Get a session for the test user
  822. self.assertTrue(
  823. self.client.login(
  824. username=self.TEST_USERNAME,
  825. password=self.TEST_PASSWORD,
  826. )
  827. )
  828. # Prepare a request object
  829. request = HttpRequest()
  830. request.session = self.client.session
  831. # Remove NewModelBackend
  832. with self.settings(
  833. AUTHENTICATION_BACKENDS=["django.contrib.auth.backends.ModelBackend"]
  834. ):
  835. # Get the user from the request
  836. user = get_user(request)
  837. # Assert that the user retrieval is successful and the user is
  838. # anonymous as the backend is not longer available.
  839. self.assertIsNotNone(user)
  840. self.assertTrue(user.is_anonymous)
  841. class TypeErrorBackend:
  842. """
  843. Always raises TypeError.
  844. """
  845. @sensitive_variables("password")
  846. def authenticate(self, request, username=None, password=None):
  847. raise TypeError
  848. @sensitive_variables("password")
  849. async def aauthenticate(self, request, username=None, password=None):
  850. raise TypeError
  851. class SkippedBackend:
  852. def authenticate(self):
  853. # Doesn't accept any credentials so is skipped by authenticate().
  854. pass
  855. class SkippedBackendWithDecoratedMethod:
  856. @sensitive_variables()
  857. def authenticate(self):
  858. pass
  859. class AuthenticateTests(TestCase):
  860. @classmethod
  861. def setUpTestData(cls):
  862. cls.user1 = User.objects.create_user("test", "test@example.com", "test")
  863. def setUp(self):
  864. self.sensitive_password = "mypassword"
  865. @override_settings(
  866. AUTHENTICATION_BACKENDS=["auth_tests.test_auth_backends.TypeErrorBackend"]
  867. )
  868. def test_type_error_raised(self):
  869. """A TypeError within a backend is propagated properly (#18171)."""
  870. with self.assertRaises(TypeError):
  871. authenticate(username="test", password="test")
  872. @override_settings(
  873. AUTHENTICATION_BACKENDS=["auth_tests.test_auth_backends.TypeErrorBackend"]
  874. )
  875. def test_authenticate_sensitive_variables(self):
  876. try:
  877. authenticate(username="testusername", password=self.sensitive_password)
  878. except TypeError:
  879. exc_info = sys.exc_info()
  880. rf = RequestFactory()
  881. response = technical_500_response(rf.get("/"), *exc_info)
  882. self.assertNotContains(response, self.sensitive_password, status_code=500)
  883. self.assertContains(response, "TypeErrorBackend", status_code=500)
  884. self.assertContains(
  885. response,
  886. '<tr><td>credentials</td><td class="code">'
  887. "<pre>&#39;********************&#39;</pre></td></tr>",
  888. html=True,
  889. status_code=500,
  890. )
  891. @override_settings(
  892. AUTHENTICATION_BACKENDS=["auth_tests.test_auth_backends.TypeErrorBackend"]
  893. )
  894. async def test_aauthenticate_sensitive_variables(self):
  895. try:
  896. await aauthenticate(
  897. username="testusername", password=self.sensitive_password
  898. )
  899. except TypeError:
  900. exc_info = sys.exc_info()
  901. rf = RequestFactory()
  902. response = technical_500_response(rf.get("/"), *exc_info)
  903. self.assertNotContains(response, self.sensitive_password, status_code=500)
  904. self.assertContains(response, "TypeErrorBackend", status_code=500)
  905. self.assertContains(
  906. response,
  907. '<tr><td>credentials</td><td class="code">'
  908. "<pre>&#39;********************&#39;</pre></td></tr>",
  909. html=True,
  910. status_code=500,
  911. )
  912. def test_clean_credentials_sensitive_variables(self):
  913. try:
  914. # Passing in a list to cause an exception
  915. _clean_credentials([1, self.sensitive_password])
  916. except TypeError:
  917. exc_info = sys.exc_info()
  918. rf = RequestFactory()
  919. response = technical_500_response(rf.get("/"), *exc_info)
  920. self.assertNotContains(response, self.sensitive_password, status_code=500)
  921. self.assertContains(
  922. response,
  923. '<tr><td>credentials</td><td class="code">'
  924. "<pre>&#39;********************&#39;</pre></td></tr>",
  925. html=True,
  926. status_code=500,
  927. )
  928. @override_settings(
  929. AUTHENTICATION_BACKENDS=(
  930. "auth_tests.test_auth_backends.SkippedBackend",
  931. "django.contrib.auth.backends.ModelBackend",
  932. )
  933. )
  934. def test_skips_backends_without_arguments(self):
  935. """
  936. A backend (SkippedBackend) is ignored if it doesn't accept the
  937. credentials as arguments.
  938. """
  939. self.assertEqual(authenticate(username="test", password="test"), self.user1)
  940. @override_settings(
  941. AUTHENTICATION_BACKENDS=(
  942. "auth_tests.test_auth_backends.SkippedBackendWithDecoratedMethod",
  943. "django.contrib.auth.backends.ModelBackend",
  944. )
  945. )
  946. def test_skips_backends_with_decorated_method(self):
  947. self.assertEqual(authenticate(username="test", password="test"), self.user1)
  948. class ImproperlyConfiguredUserModelTest(TestCase):
  949. """
  950. An exception from within get_user_model() is propagated and doesn't
  951. raise an UnboundLocalError (#21439).
  952. """
  953. @classmethod
  954. def setUpTestData(cls):
  955. cls.user1 = User.objects.create_user("test", "test@example.com", "test")
  956. def setUp(self):
  957. self.client.login(username="test", password="test")
  958. @override_settings(AUTH_USER_MODEL="thismodel.doesntexist")
  959. def test_does_not_shadow_exception(self):
  960. # Prepare a request object
  961. request = HttpRequest()
  962. request.session = self.client.session
  963. msg = (
  964. "AUTH_USER_MODEL refers to model 'thismodel.doesntexist' "
  965. "that has not been installed"
  966. )
  967. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  968. get_user(request)
  969. class ImportedModelBackend(ModelBackend):
  970. pass
  971. class CustomModelBackend(ModelBackend):
  972. pass
  973. class OtherModelBackend(ModelBackend):
  974. pass
  975. class ImportedBackendTests(TestCase):
  976. """
  977. #23925 - The backend path added to the session should be the same
  978. as the one defined in AUTHENTICATION_BACKENDS setting.
  979. """
  980. backend = "auth_tests.backend_alias.ImportedModelBackend"
  981. @override_settings(AUTHENTICATION_BACKENDS=[backend])
  982. def test_backend_path(self):
  983. username = "username"
  984. password = "password"
  985. User.objects.create_user(username, "email", password)
  986. self.assertTrue(self.client.login(username=username, password=password))
  987. request = HttpRequest()
  988. request.session = self.client.session
  989. self.assertEqual(request.session[BACKEND_SESSION_KEY], self.backend)
  990. class SelectingBackendTests(TestCase):
  991. backend = "auth_tests.test_auth_backends.CustomModelBackend"
  992. other_backend = "auth_tests.test_auth_backends.OtherModelBackend"
  993. username = "username"
  994. password = "password"
  995. def assertBackendInSession(self, backend):
  996. request = HttpRequest()
  997. request.session = self.client.session
  998. self.assertEqual(request.session[BACKEND_SESSION_KEY], backend)
  999. @override_settings(AUTHENTICATION_BACKENDS=[backend])
  1000. def test_backend_path_login_without_authenticate_single_backend(self):
  1001. user = User.objects.create_user(self.username, "email", self.password)
  1002. self.client._login(user)
  1003. self.assertBackendInSession(self.backend)
  1004. @override_settings(AUTHENTICATION_BACKENDS=[backend, other_backend])
  1005. def test_backend_path_login_without_authenticate_multiple_backends(self):
  1006. user = User.objects.create_user(self.username, "email", self.password)
  1007. expected_message = (
  1008. "You have multiple authentication backends configured and "
  1009. "therefore must provide the `backend` argument or set the "
  1010. "`backend` attribute on the user."
  1011. )
  1012. with self.assertRaisesMessage(ValueError, expected_message):
  1013. self.client._login(user)
  1014. def test_non_string_backend(self):
  1015. user = User.objects.create_user(self.username, "email", self.password)
  1016. expected_message = (
  1017. "backend must be a dotted import path string (got "
  1018. "<class 'django.contrib.auth.backends.ModelBackend'>)."
  1019. )
  1020. with self.assertRaisesMessage(TypeError, expected_message):
  1021. self.client._login(user, backend=ModelBackend)
  1022. @override_settings(AUTHENTICATION_BACKENDS=[backend, other_backend])
  1023. def test_backend_path_login_with_explicit_backends(self):
  1024. user = User.objects.create_user(self.username, "email", self.password)
  1025. self.client._login(user, self.other_backend)
  1026. self.assertBackendInSession(self.other_backend)
  1027. @override_settings(
  1028. AUTHENTICATION_BACKENDS=["django.contrib.auth.backends.AllowAllUsersModelBackend"]
  1029. )
  1030. class AllowAllUsersModelBackendTest(TestCase):
  1031. """
  1032. Inactive users may authenticate with the AllowAllUsersModelBackend.
  1033. """
  1034. user_credentials = {"username": "test", "password": "test"}
  1035. @classmethod
  1036. def setUpTestData(cls):
  1037. cls.user = User.objects.create_user(
  1038. email="test@example.com", is_active=False, **cls.user_credentials
  1039. )
  1040. def test_authenticate(self):
  1041. self.assertFalse(self.user.is_active)
  1042. self.assertEqual(authenticate(**self.user_credentials), self.user)
  1043. def test_get_user(self):
  1044. self.client.force_login(self.user)
  1045. request = HttpRequest()
  1046. request.session = self.client.session
  1047. user = get_user(request)
  1048. self.assertEqual(user, self.user)