PageRenderTime 43ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/python-packages/django/contrib/auth/tests/auth_backends.py

https://gitlab.com/gregtyka/ka-lite
Python | 369 lines | 330 code | 18 blank | 21 comment | 2 complexity | 28bebaa1ab0086b0b3b0c42fc52cd6d3 MD5 | raw file
  1. from __future__ import unicode_literals
  2. from datetime import date
  3. from django.conf import settings
  4. from django.contrib.auth.models import User, Group, Permission, AnonymousUser
  5. from django.contrib.auth.tests.utils import skipIfCustomUser
  6. from django.contrib.auth.tests.custom_user import ExtensionUser, CustomPermissionsUser, CustomUser
  7. from django.contrib.contenttypes.models import ContentType
  8. from django.core.exceptions import ImproperlyConfigured
  9. from django.contrib.auth import authenticate
  10. from django.test import TestCase
  11. from django.test.utils import override_settings
  12. class BaseModelBackendTest(object):
  13. """
  14. A base class for tests that need to validate the ModelBackend
  15. with different User models. Subclasses should define a class
  16. level UserModel attribute, and a create_users() method to
  17. construct two users for test purposes.
  18. """
  19. backend = 'django.contrib.auth.backends.ModelBackend'
  20. def setUp(self):
  21. self.curr_auth = settings.AUTHENTICATION_BACKENDS
  22. settings.AUTHENTICATION_BACKENDS = (self.backend,)
  23. self.create_users()
  24. def tearDown(self):
  25. settings.AUTHENTICATION_BACKENDS = self.curr_auth
  26. # The custom_perms test messes with ContentTypes, which will
  27. # be cached; flush the cache to ensure there are no side effects
  28. # Refs #14975, #14925
  29. ContentType.objects.clear_cache()
  30. def test_has_perm(self):
  31. user = self.UserModel._default_manager.get(pk=self.user.pk)
  32. self.assertEqual(user.has_perm('auth.test'), False)
  33. user.is_staff = True
  34. user.save()
  35. self.assertEqual(user.has_perm('auth.test'), False)
  36. user.is_superuser = True
  37. user.save()
  38. self.assertEqual(user.has_perm('auth.test'), True)
  39. user.is_staff = False
  40. user.is_superuser = False
  41. user.save()
  42. self.assertEqual(user.has_perm('auth.test'), False)
  43. user.is_staff = True
  44. user.is_superuser = True
  45. user.is_active = False
  46. user.save()
  47. self.assertEqual(user.has_perm('auth.test'), False)
  48. def test_custom_perms(self):
  49. user = self.UserModel._default_manager.get(pk=self.user.pk)
  50. content_type = ContentType.objects.get_for_model(Group)
  51. perm = Permission.objects.create(name='test', content_type=content_type, codename='test')
  52. user.user_permissions.add(perm)
  53. user.save()
  54. # reloading user to purge the _perm_cache
  55. user = self.UserModel._default_manager.get(pk=self.user.pk)
  56. self.assertEqual(user.get_all_permissions() == set(['auth.test']), True)
  57. self.assertEqual(user.get_group_permissions(), set([]))
  58. self.assertEqual(user.has_module_perms('Group'), False)
  59. self.assertEqual(user.has_module_perms('auth'), True)
  60. perm = Permission.objects.create(name='test2', content_type=content_type, codename='test2')
  61. user.user_permissions.add(perm)
  62. user.save()
  63. perm = Permission.objects.create(name='test3', content_type=content_type, codename='test3')
  64. user.user_permissions.add(perm)
  65. user.save()
  66. user = self.UserModel._default_manager.get(pk=self.user.pk)
  67. self.assertEqual(user.get_all_permissions(), set(['auth.test2', 'auth.test', 'auth.test3']))
  68. self.assertEqual(user.has_perm('test'), False)
  69. self.assertEqual(user.has_perm('auth.test'), True)
  70. self.assertEqual(user.has_perms(['auth.test2', 'auth.test3']), True)
  71. perm = Permission.objects.create(name='test_group', content_type=content_type, codename='test_group')
  72. group = Group.objects.create(name='test_group')
  73. group.permissions.add(perm)
  74. group.save()
  75. user.groups.add(group)
  76. user = self.UserModel._default_manager.get(pk=self.user.pk)
  77. exp = set(['auth.test2', 'auth.test', 'auth.test3', 'auth.test_group'])
  78. self.assertEqual(user.get_all_permissions(), exp)
  79. self.assertEqual(user.get_group_permissions(), set(['auth.test_group']))
  80. self.assertEqual(user.has_perms(['auth.test3', 'auth.test_group']), True)
  81. user = AnonymousUser()
  82. self.assertEqual(user.has_perm('test'), False)
  83. self.assertEqual(user.has_perms(['auth.test2', 'auth.test3']), False)
  84. def test_has_no_object_perm(self):
  85. """Regressiontest for #12462"""
  86. user = self.UserModel._default_manager.get(pk=self.user.pk)
  87. content_type = ContentType.objects.get_for_model(Group)
  88. perm = Permission.objects.create(name='test', content_type=content_type, codename='test')
  89. user.user_permissions.add(perm)
  90. user.save()
  91. self.assertEqual(user.has_perm('auth.test', 'object'), False)
  92. self.assertEqual(user.get_all_permissions('object'), set([]))
  93. self.assertEqual(user.has_perm('auth.test'), True)
  94. self.assertEqual(user.get_all_permissions(), set(['auth.test']))
  95. def test_get_all_superuser_permissions(self):
  96. "A superuser has all permissions. Refs #14795"
  97. user = self.UserModel._default_manager.get(pk=self.superuser.pk)
  98. self.assertEqual(len(user.get_all_permissions()), len(Permission.objects.all()))
  99. @skipIfCustomUser
  100. class ModelBackendTest(BaseModelBackendTest, TestCase):
  101. """
  102. Tests for the ModelBackend using the default User model.
  103. """
  104. UserModel = User
  105. def create_users(self):
  106. self.user = User.objects.create_user(
  107. username='test',
  108. email='test@example.com',
  109. password='test',
  110. )
  111. self.superuser = User.objects.create_superuser(
  112. username='test2',
  113. email='test2@example.com',
  114. password='test',
  115. )
  116. @override_settings(AUTH_USER_MODEL='auth.ExtensionUser')
  117. class ExtensionUserModelBackendTest(BaseModelBackendTest, TestCase):
  118. """
  119. Tests for the ModelBackend using the custom ExtensionUser model.
  120. This isn't a perfect test, because both the User and ExtensionUser are
  121. synchronized to the database, which wouldn't ordinary happen in
  122. production. As a result, it doesn't catch errors caused by the non-
  123. existence of the User table.
  124. The specific problem is queries on .filter(groups__user) et al, which
  125. makes an implicit assumption that the user model is called 'User'. In
  126. production, the auth.User table won't exist, so the requested join
  127. won't exist either; in testing, the auth.User *does* exist, and
  128. so does the join. However, the join table won't contain any useful
  129. data; for testing, we check that the data we expect actually does exist.
  130. """
  131. UserModel = ExtensionUser
  132. def create_users(self):
  133. self.user = ExtensionUser._default_manager.create_user(
  134. username='test',
  135. email='test@example.com',
  136. password='test',
  137. date_of_birth=date(2006, 4, 25)
  138. )
  139. self.superuser = ExtensionUser._default_manager.create_superuser(
  140. username='test2',
  141. email='test2@example.com',
  142. password='test',
  143. date_of_birth=date(1976, 11, 8)
  144. )
  145. @override_settings(AUTH_USER_MODEL='auth.CustomPermissionsUser')
  146. class CustomPermissionsUserModelBackendTest(BaseModelBackendTest, TestCase):
  147. """
  148. Tests for the ModelBackend using the CustomPermissionsUser model.
  149. As with the ExtensionUser test, this isn't a perfect test, because both
  150. the User and CustomPermissionsUser are synchronized to the database,
  151. which wouldn't ordinary happen in production.
  152. """
  153. UserModel = CustomPermissionsUser
  154. def create_users(self):
  155. self.user = CustomPermissionsUser._default_manager.create_user(
  156. email='test@example.com',
  157. password='test',
  158. date_of_birth=date(2006, 4, 25)
  159. )
  160. self.superuser = CustomPermissionsUser._default_manager.create_superuser(
  161. email='test2@example.com',
  162. password='test',
  163. date_of_birth=date(1976, 11, 8)
  164. )
  165. @override_settings(AUTH_USER_MODEL='auth.CustomUser')
  166. class CustomUserModelBackendAuthenticateTest(TestCase):
  167. """
  168. Tests that the model backend can accept a credentials kwarg labeled with
  169. custom user model's USERNAME_FIELD.
  170. """
  171. def test_authenticate(self):
  172. test_user = CustomUser._default_manager.create_user(
  173. email='test@example.com',
  174. password='test',
  175. date_of_birth=date(2006, 4, 25)
  176. )
  177. authenticated_user = authenticate(email='test@example.com', password='test')
  178. self.assertEqual(test_user, authenticated_user)
  179. class TestObj(object):
  180. pass
  181. class SimpleRowlevelBackend(object):
  182. def has_perm(self, user, perm, obj=None):
  183. if not obj:
  184. return # We only support row level perms
  185. if isinstance(obj, TestObj):
  186. if user.username == 'test2':
  187. return True
  188. elif user.is_anonymous() and perm == 'anon':
  189. return True
  190. elif not user.is_active and perm == 'inactive':
  191. return True
  192. return False
  193. def has_module_perms(self, user, app_label):
  194. if not user.is_anonymous() and not user.is_active:
  195. return False
  196. return app_label == "app1"
  197. def get_all_permissions(self, user, obj=None):
  198. if not obj:
  199. return [] # We only support row level perms
  200. if not isinstance(obj, TestObj):
  201. return ['none']
  202. if user.is_anonymous():
  203. return ['anon']
  204. if user.username == 'test2':
  205. return ['simple', 'advanced']
  206. else:
  207. return ['simple']
  208. def get_group_permissions(self, user, obj=None):
  209. if not obj:
  210. return # We only support row level perms
  211. if not isinstance(obj, TestObj):
  212. return ['none']
  213. if 'test_group' in [group.name for group in user.groups.all()]:
  214. return ['group_perm']
  215. else:
  216. return ['none']
  217. @skipIfCustomUser
  218. class RowlevelBackendTest(TestCase):
  219. """
  220. Tests for auth backend that supports object level permissions
  221. """
  222. backend = 'django.contrib.auth.tests.auth_backends.SimpleRowlevelBackend'
  223. def setUp(self):
  224. self.curr_auth = settings.AUTHENTICATION_BACKENDS
  225. settings.AUTHENTICATION_BACKENDS = tuple(self.curr_auth) + (self.backend,)
  226. self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
  227. self.user2 = User.objects.create_user('test2', 'test2@example.com', 'test')
  228. self.user3 = User.objects.create_user('test3', 'test3@example.com', 'test')
  229. def tearDown(self):
  230. settings.AUTHENTICATION_BACKENDS = self.curr_auth
  231. # The get_group_permissions test messes with ContentTypes, which will
  232. # be cached; flush the cache to ensure there are no side effects
  233. # Refs #14975, #14925
  234. ContentType.objects.clear_cache()
  235. def test_has_perm(self):
  236. self.assertEqual(self.user1.has_perm('perm', TestObj()), False)
  237. self.assertEqual(self.user2.has_perm('perm', TestObj()), True)
  238. self.assertEqual(self.user2.has_perm('perm'), False)
  239. self.assertEqual(self.user2.has_perms(['simple', 'advanced'], TestObj()), True)
  240. self.assertEqual(self.user3.has_perm('perm', TestObj()), False)
  241. self.assertEqual(self.user3.has_perm('anon', TestObj()), False)
  242. self.assertEqual(self.user3.has_perms(['simple', 'advanced'], TestObj()), False)
  243. def test_get_all_permissions(self):
  244. self.assertEqual(self.user1.get_all_permissions(TestObj()), set(['simple']))
  245. self.assertEqual(self.user2.get_all_permissions(TestObj()), set(['simple', 'advanced']))
  246. self.assertEqual(self.user2.get_all_permissions(), set([]))
  247. def test_get_group_permissions(self):
  248. group = Group.objects.create(name='test_group')
  249. self.user3.groups.add(group)
  250. self.assertEqual(self.user3.get_group_permissions(TestObj()), set(['group_perm']))
  251. class AnonymousUserBackendTest(TestCase):
  252. """
  253. Tests for AnonymousUser delegating to backend.
  254. """
  255. backend = 'django.contrib.auth.tests.auth_backends.SimpleRowlevelBackend'
  256. def setUp(self):
  257. self.curr_auth = settings.AUTHENTICATION_BACKENDS
  258. settings.AUTHENTICATION_BACKENDS = (self.backend,)
  259. self.user1 = AnonymousUser()
  260. def tearDown(self):
  261. settings.AUTHENTICATION_BACKENDS = self.curr_auth
  262. def test_has_perm(self):
  263. self.assertEqual(self.user1.has_perm('perm', TestObj()), False)
  264. self.assertEqual(self.user1.has_perm('anon', TestObj()), True)
  265. def test_has_perms(self):
  266. self.assertEqual(self.user1.has_perms(['anon'], TestObj()), True)
  267. self.assertEqual(self.user1.has_perms(['anon', 'perm'], TestObj()), False)
  268. def test_has_module_perms(self):
  269. self.assertEqual(self.user1.has_module_perms("app1"), True)
  270. self.assertEqual(self.user1.has_module_perms("app2"), False)
  271. def test_get_all_permissions(self):
  272. self.assertEqual(self.user1.get_all_permissions(TestObj()), set(['anon']))
  273. @skipIfCustomUser
  274. @override_settings(AUTHENTICATION_BACKENDS=[])
  275. class NoBackendsTest(TestCase):
  276. """
  277. Tests that an appropriate error is raised if no auth backends are provided.
  278. """
  279. def setUp(self):
  280. self.user = User.objects.create_user('test', 'test@example.com', 'test')
  281. def test_raises_exception(self):
  282. self.assertRaises(ImproperlyConfigured, self.user.has_perm, ('perm', TestObj(),))
  283. @skipIfCustomUser
  284. class InActiveUserBackendTest(TestCase):
  285. """
  286. Tests for a inactive user
  287. """
  288. backend = 'django.contrib.auth.tests.auth_backends.SimpleRowlevelBackend'
  289. def setUp(self):
  290. self.curr_auth = settings.AUTHENTICATION_BACKENDS
  291. settings.AUTHENTICATION_BACKENDS = (self.backend,)
  292. self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
  293. self.user1.is_active = False
  294. self.user1.save()
  295. def tearDown(self):
  296. settings.AUTHENTICATION_BACKENDS = self.curr_auth
  297. def test_has_perm(self):
  298. self.assertEqual(self.user1.has_perm('perm', TestObj()), False)
  299. self.assertEqual(self.user1.has_perm('inactive', TestObj()), True)
  300. def test_has_module_perms(self):
  301. self.assertEqual(self.user1.has_module_perms("app1"), False)
  302. self.assertEqual(self.user1.has_module_perms("app2"), False)