default.txt 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857
  1. ======================================
  2. Using the Django authentication system
  3. ======================================
  4. .. currentmodule:: django.contrib.auth
  5. This document explains the usage of Django's authentication system in its
  6. default configuration. This configuration has evolved to serve the most common
  7. project needs, handling a reasonably wide range of tasks, and has a careful
  8. implementation of passwords and permissions. For projects where authentication
  9. needs differ from the default, Django supports extensive :doc:`extension and
  10. customization </topics/auth/customizing>` of authentication.
  11. Django authentication provides both authentication and authorization together
  12. and is generally referred to as the authentication system, as these features
  13. are somewhat coupled.
  14. .. _user-objects:
  15. ``User`` objects
  16. ================
  17. :class:`~django.contrib.auth.models.User` objects are the core of the
  18. authentication system. They typically represent the people interacting with
  19. your site and are used to enable things like restricting access, registering
  20. user profiles, associating content with creators etc. Only one class of user
  21. exists in Django's authentication framework, i.e., :attr:`'superusers'
  22. <django.contrib.auth.models.User.is_superuser>` or admin :attr:`'staff'
  23. <django.contrib.auth.models.User.is_staff>` users are just user objects with
  24. special attributes set, not different classes of user objects.
  25. The primary attributes of the default user are:
  26. * :attr:`~django.contrib.auth.models.User.username`
  27. * :attr:`~django.contrib.auth.models.User.password`
  28. * :attr:`~django.contrib.auth.models.User.email`
  29. * :attr:`~django.contrib.auth.models.User.first_name`
  30. * :attr:`~django.contrib.auth.models.User.last_name`
  31. See the :class:`full API documentation <django.contrib.auth.models.User>` for
  32. full reference, the documentation that follows is more task oriented.
  33. .. _topics-auth-creating-users:
  34. Creating users
  35. --------------
  36. The most direct way to create users is to use the included
  37. :meth:`~django.contrib.auth.models.UserManager.create_user` helper function:
  38. .. code-block:: pycon
  39. >>> from django.contrib.auth.models import User
  40. >>> user = User.objects.create_user("john", "lennon@thebeatles.com", "johnpassword")
  41. # At this point, user is a User object that has already been saved
  42. # to the database. You can continue to change its attributes
  43. # if you want to change other fields.
  44. >>> user.last_name = "Lennon"
  45. >>> user.save()
  46. If you have the Django admin installed, you can also :ref:`create users
  47. interactively <auth-admin>`.
  48. .. _topics-auth-creating-superusers:
  49. Creating superusers
  50. -------------------
  51. Create superusers using the :djadmin:`createsuperuser` command:
  52. .. console::
  53. $ python manage.py createsuperuser --username=joe --email=joe@example.com
  54. You will be prompted for a password. After you enter one, the user will be
  55. created immediately. If you leave off the :option:`--username <createsuperuser
  56. --username>` or :option:`--email <createsuperuser --email>` options, it will
  57. prompt you for those values.
  58. Changing passwords
  59. ------------------
  60. Django does not store raw (clear text) passwords on the user model, but only
  61. a hash (see :doc:`documentation of how passwords are managed
  62. </topics/auth/passwords>` for full details). Because of this, do not attempt to
  63. manipulate the password attribute of the user directly. This is why a helper
  64. function is used when creating a user.
  65. To change a user's password, you have several options:
  66. :djadmin:`manage.py changepassword *username* <changepassword>` offers a method
  67. of changing a user's password from the command line. It prompts you to
  68. change the password of a given user which you must enter twice. If
  69. they both match, the new password will be changed immediately. If you
  70. do not supply a user, the command will attempt to change the password
  71. whose username matches the current system user.
  72. You can also change a password programmatically, using
  73. :meth:`~django.contrib.auth.models.User.set_password()`:
  74. .. code-block:: pycon
  75. >>> from django.contrib.auth.models import User
  76. >>> u = User.objects.get(username="john")
  77. >>> u.set_password("new password")
  78. >>> u.save()
  79. If you have the Django admin installed, you can also change user's passwords
  80. on the :ref:`authentication system's admin pages <auth-admin>`.
  81. Django also provides :ref:`views <built-in-auth-views>` and :ref:`forms
  82. <built-in-auth-forms>` that may be used to allow users to change their own
  83. passwords.
  84. Changing a user's password will log out all their sessions. See
  85. :ref:`session-invalidation-on-password-change` for details.
  86. Authenticating users
  87. --------------------
  88. .. function:: authenticate(request=None, **credentials)
  89. Use :func:`~django.contrib.auth.authenticate()` to verify a set of
  90. credentials. It takes credentials as keyword arguments, ``username`` and
  91. ``password`` for the default case, checks them against each
  92. :ref:`authentication backend <authentication-backends>`, and returns a
  93. :class:`~django.contrib.auth.models.User` object if the credentials are
  94. valid for a backend. If the credentials aren't valid for any backend or if
  95. a backend raises :class:`~django.core.exceptions.PermissionDenied`, it
  96. returns ``None``. For example::
  97. from django.contrib.auth import authenticate
  98. user = authenticate(username="john", password="secret")
  99. if user is not None:
  100. # A backend authenticated the credentials
  101. ...
  102. else:
  103. # No backend authenticated the credentials
  104. ...
  105. ``request`` is an optional :class:`~django.http.HttpRequest` which is
  106. passed on the ``authenticate()`` method of the authentication backends.
  107. .. note::
  108. This is a low level way to authenticate a set of credentials; for
  109. example, it's used by the
  110. :class:`~django.contrib.auth.middleware.RemoteUserMiddleware`. Unless
  111. you are writing your own authentication system, you probably won't use
  112. this. Rather if you're looking for a way to login a user, use the
  113. :class:`~django.contrib.auth.views.LoginView`.
  114. .. _topic-authorization:
  115. Permissions and Authorization
  116. =============================
  117. Django comes with a built-in permissions system. It provides a way to assign
  118. permissions to specific users and groups of users.
  119. It's used by the Django admin site, but you're welcome to use it in your own
  120. code.
  121. The Django admin site uses permissions as follows:
  122. * Access to view objects is limited to users with the "view" or "change"
  123. permission for that type of object.
  124. * Access to view the "add" form and add an object is limited to users with
  125. the "add" permission for that type of object.
  126. * Access to view the change list, view the "change" form and change an
  127. object is limited to users with the "change" permission for that type of
  128. object.
  129. * Access to delete an object is limited to users with the "delete"
  130. permission for that type of object.
  131. Permissions can be set not only per type of object, but also per specific
  132. object instance. By using the
  133. :meth:`~django.contrib.admin.ModelAdmin.has_view_permission`,
  134. :meth:`~django.contrib.admin.ModelAdmin.has_add_permission`,
  135. :meth:`~django.contrib.admin.ModelAdmin.has_change_permission` and
  136. :meth:`~django.contrib.admin.ModelAdmin.has_delete_permission` methods provided
  137. by the :class:`~django.contrib.admin.ModelAdmin` class, it is possible to
  138. customize permissions for different object instances of the same type.
  139. :class:`~django.contrib.auth.models.User` objects have two many-to-many
  140. fields: ``groups`` and ``user_permissions``.
  141. :class:`~django.contrib.auth.models.User` objects can access their related
  142. objects in the same way as any other :doc:`Django model
  143. </topics/db/models>`::
  144. myuser.groups.set([group_list])
  145. myuser.groups.add(group, group, ...)
  146. myuser.groups.remove(group, group, ...)
  147. myuser.groups.clear()
  148. myuser.user_permissions.set([permission_list])
  149. myuser.user_permissions.add(permission, permission, ...)
  150. myuser.user_permissions.remove(permission, permission, ...)
  151. myuser.user_permissions.clear()
  152. Default permissions
  153. -------------------
  154. When ``django.contrib.auth`` is listed in your :setting:`INSTALLED_APPS`
  155. setting, it will ensure that four default permissions -- add, change, delete,
  156. and view -- are created for each Django model defined in one of your installed
  157. applications.
  158. These permissions will be created when you run :djadmin:`manage.py migrate
  159. <migrate>`; the first time you run ``migrate`` after adding
  160. ``django.contrib.auth`` to :setting:`INSTALLED_APPS`, the default permissions
  161. will be created for all previously-installed models, as well as for any new
  162. models being installed at that time. Afterward, it will create default
  163. permissions for new models each time you run :djadmin:`manage.py migrate
  164. <migrate>` (the function that creates permissions is connected to the
  165. :data:`~django.db.models.signals.post_migrate` signal).
  166. Assuming you have an application with an
  167. :attr:`~django.db.models.Options.app_label` ``foo`` and a model named ``Bar``,
  168. to test for basic permissions you should use:
  169. * add: ``user.has_perm('foo.add_bar')``
  170. * change: ``user.has_perm('foo.change_bar')``
  171. * delete: ``user.has_perm('foo.delete_bar')``
  172. * view: ``user.has_perm('foo.view_bar')``
  173. The :class:`~django.contrib.auth.models.Permission` model is rarely accessed
  174. directly.
  175. Groups
  176. ------
  177. :class:`django.contrib.auth.models.Group` models are a generic way of
  178. categorizing users so you can apply permissions, or some other label, to those
  179. users. A user can belong to any number of groups.
  180. A user in a group automatically has the permissions granted to that group. For
  181. example, if the group ``Site editors`` has the permission
  182. ``can_edit_home_page``, any user in that group will have that permission.
  183. Beyond permissions, groups are a convenient way to categorize users to give
  184. them some label, or extended functionality. For example, you could create a
  185. group ``'Special users'``, and you could write code that could, say, give them
  186. access to a members-only portion of your site, or send them members-only email
  187. messages.
  188. Programmatically creating permissions
  189. -------------------------------------
  190. While :ref:`custom permissions <custom-permissions>` can be defined within
  191. a model's ``Meta`` class, you can also create permissions directly. For
  192. example, you can create the ``can_publish`` permission for a ``BlogPost`` model
  193. in ``myapp``::
  194. from myapp.models import BlogPost
  195. from django.contrib.auth.models import Permission
  196. from django.contrib.contenttypes.models import ContentType
  197. content_type = ContentType.objects.get_for_model(BlogPost)
  198. permission = Permission.objects.create(
  199. codename="can_publish",
  200. name="Can Publish Posts",
  201. content_type=content_type,
  202. )
  203. The permission can then be assigned to a
  204. :class:`~django.contrib.auth.models.User` via its ``user_permissions``
  205. attribute or to a :class:`~django.contrib.auth.models.Group` via its
  206. ``permissions`` attribute.
  207. .. admonition:: Proxy models need their own content type
  208. If you want to create :ref:`permissions for a proxy model
  209. <proxy-models-permissions-topic>`, pass ``for_concrete_model=False`` to
  210. :meth:`.ContentTypeManager.get_for_model` to get the appropriate
  211. ``ContentType``::
  212. content_type = ContentType.objects.get_for_model(
  213. BlogPostProxy, for_concrete_model=False
  214. )
  215. Permission caching
  216. ------------------
  217. The :class:`~django.contrib.auth.backends.ModelBackend` caches permissions on
  218. the user object after the first time they need to be fetched for a permissions
  219. check. This is typically fine for the request-response cycle since permissions
  220. aren't typically checked immediately after they are added (in the admin, for
  221. example). If you are adding permissions and checking them immediately
  222. afterward, in a test or view for example, the easiest solution is to re-fetch
  223. the user from the database. For example::
  224. from django.contrib.auth.models import Permission, User
  225. from django.contrib.contenttypes.models import ContentType
  226. from django.shortcuts import get_object_or_404
  227. from myapp.models import BlogPost
  228. def user_gains_perms(request, user_id):
  229. user = get_object_or_404(User, pk=user_id)
  230. # any permission check will cache the current set of permissions
  231. user.has_perm("myapp.change_blogpost")
  232. content_type = ContentType.objects.get_for_model(BlogPost)
  233. permission = Permission.objects.get(
  234. codename="change_blogpost",
  235. content_type=content_type,
  236. )
  237. user.user_permissions.add(permission)
  238. # Checking the cached permission set
  239. user.has_perm("myapp.change_blogpost") # False
  240. # Request new instance of User
  241. # Be aware that user.refresh_from_db() won't clear the cache.
  242. user = get_object_or_404(User, pk=user_id)
  243. # Permission cache is repopulated from the database
  244. user.has_perm("myapp.change_blogpost") # True
  245. ...
  246. .. _proxy-models-permissions-topic:
  247. Proxy models
  248. ------------
  249. Proxy models work exactly the same way as concrete models. Permissions are
  250. created using the own content type of the proxy model. Proxy models don't
  251. inherit the permissions of the concrete model they subclass::
  252. class Person(models.Model):
  253. class Meta:
  254. permissions = [("can_eat_pizzas", "Can eat pizzas")]
  255. class Student(Person):
  256. class Meta:
  257. proxy = True
  258. permissions = [("can_deliver_pizzas", "Can deliver pizzas")]
  259. .. code-block:: pycon
  260. >>> # Fetch the content type for the proxy model.
  261. >>> content_type = ContentType.objects.get_for_model(Student, for_concrete_model=False)
  262. >>> student_permissions = Permission.objects.filter(content_type=content_type)
  263. >>> [p.codename for p in student_permissions]
  264. ['add_student', 'change_student', 'delete_student', 'view_student',
  265. 'can_deliver_pizzas']
  266. >>> for permission in student_permissions:
  267. ... user.user_permissions.add(permission)
  268. ...
  269. >>> user.has_perm("app.add_person")
  270. False
  271. >>> user.has_perm("app.can_eat_pizzas")
  272. False
  273. >>> user.has_perms(("app.add_student", "app.can_deliver_pizzas"))
  274. True
  275. .. _auth-web-requests:
  276. Authentication in web requests
  277. ==============================
  278. Django uses :doc:`sessions </topics/http/sessions>` and middleware to hook the
  279. authentication system into :class:`request objects <django.http.HttpRequest>`.
  280. These provide a :attr:`request.user <django.http.HttpRequest.user>` attribute
  281. and a :meth:`request.auser <django.http.HttpRequest.auser>` async method
  282. on every request which represents the current user. If the current user has not
  283. logged in, this attribute will be set to an instance
  284. of :class:`~django.contrib.auth.models.AnonymousUser`, otherwise it will be an
  285. instance of :class:`~django.contrib.auth.models.User`.
  286. You can tell them apart with
  287. :attr:`~django.contrib.auth.models.User.is_authenticated`, like so::
  288. if request.user.is_authenticated:
  289. # Do something for authenticated users.
  290. ...
  291. else:
  292. # Do something for anonymous users.
  293. ...
  294. Or in an asynchronous view::
  295. user = await request.auser()
  296. if user.is_authenticated:
  297. # Do something for authenticated users.
  298. ...
  299. else:
  300. # Do something for anonymous users.
  301. ...
  302. .. versionchanged:: 5.0
  303. The :meth:`.HttpRequest.auser` method was added.
  304. .. _how-to-log-a-user-in:
  305. How to log a user in
  306. --------------------
  307. If you have an authenticated user you want to attach to the current session
  308. - this is done with a :func:`~django.contrib.auth.login` function.
  309. .. function:: login(request, user, backend=None)
  310. To log a user in, from a view, use :func:`~django.contrib.auth.login()`. It
  311. takes an :class:`~django.http.HttpRequest` object and a
  312. :class:`~django.contrib.auth.models.User` object.
  313. :func:`~django.contrib.auth.login()` saves the user's ID in the session,
  314. using Django's session framework.
  315. Note that any data set during the anonymous session is retained in the
  316. session after a user logs in.
  317. This example shows how you might use both
  318. :func:`~django.contrib.auth.authenticate()` and
  319. :func:`~django.contrib.auth.login()`::
  320. from django.contrib.auth import authenticate, login
  321. def my_view(request):
  322. username = request.POST["username"]
  323. password = request.POST["password"]
  324. user = authenticate(request, username=username, password=password)
  325. if user is not None:
  326. login(request, user)
  327. # Redirect to a success page.
  328. ...
  329. else:
  330. # Return an 'invalid login' error message.
  331. ...
  332. Selecting the authentication backend
  333. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  334. When a user logs in, the user's ID and the backend that was used for
  335. authentication are saved in the user's session. This allows the same
  336. :ref:`authentication backend <authentication-backends>` to fetch the user's
  337. details on a future request. The authentication backend to save in the session
  338. is selected as follows:
  339. #. Use the value of the optional ``backend`` argument, if provided.
  340. #. Use the value of the ``user.backend`` attribute, if present. This allows
  341. pairing :func:`~django.contrib.auth.authenticate()` and
  342. :func:`~django.contrib.auth.login()`:
  343. :func:`~django.contrib.auth.authenticate()`
  344. sets the ``user.backend`` attribute on the user object it returns.
  345. #. Use the ``backend`` in :setting:`AUTHENTICATION_BACKENDS`, if there is only
  346. one.
  347. #. Otherwise, raise an exception.
  348. In cases 1 and 2, the value of the ``backend`` argument or the ``user.backend``
  349. attribute should be a dotted import path string (like that found in
  350. :setting:`AUTHENTICATION_BACKENDS`), not the actual backend class.
  351. How to log a user out
  352. ---------------------
  353. .. function:: logout(request)
  354. To log out a user who has been logged in via
  355. :func:`django.contrib.auth.login()`, use
  356. :func:`django.contrib.auth.logout()` within your view. It takes an
  357. :class:`~django.http.HttpRequest` object and has no return value.
  358. Example::
  359. from django.contrib.auth import logout
  360. def logout_view(request):
  361. logout(request)
  362. # Redirect to a success page.
  363. Note that :func:`~django.contrib.auth.logout()` doesn't throw any errors if
  364. the user wasn't logged in.
  365. When you call :func:`~django.contrib.auth.logout()`, the session data for
  366. the current request is completely cleaned out. All existing data is
  367. removed. This is to prevent another person from using the same web browser
  368. to log in and have access to the previous user's session data. If you want
  369. to put anything into the session that will be available to the user
  370. immediately after logging out, do that *after* calling
  371. :func:`django.contrib.auth.logout()`.
  372. Limiting access to logged-in users
  373. ----------------------------------
  374. The raw way
  375. ~~~~~~~~~~~
  376. The raw way to limit access to pages is to check
  377. :attr:`request.user.is_authenticated
  378. <django.contrib.auth.models.User.is_authenticated>` and either redirect to a
  379. login page::
  380. from django.conf import settings
  381. from django.shortcuts import redirect
  382. def my_view(request):
  383. if not request.user.is_authenticated:
  384. return redirect(f"{settings.LOGIN_URL}?next={request.path}")
  385. # ...
  386. ...or display an error message::
  387. from django.shortcuts import render
  388. def my_view(request):
  389. if not request.user.is_authenticated:
  390. return render(request, "myapp/login_error.html")
  391. # ...
  392. .. currentmodule:: django.contrib.auth.decorators
  393. The ``login_required`` decorator
  394. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  395. .. function:: login_required(redirect_field_name='next', login_url=None)
  396. As a shortcut, you can use the convenient
  397. :func:`~django.contrib.auth.decorators.login_required` decorator::
  398. from django.contrib.auth.decorators import login_required
  399. @login_required
  400. def my_view(request):
  401. ...
  402. :func:`~django.contrib.auth.decorators.login_required` does the following:
  403. * If the user isn't logged in, redirect to
  404. :setting:`settings.LOGIN_URL <LOGIN_URL>`, passing the current absolute
  405. path in the query string. Example: ``/accounts/login/?next=/polls/3/``.
  406. * If the user is logged in, execute the view normally. The view code is
  407. free to assume the user is logged in.
  408. By default, the path that the user should be redirected to upon
  409. successful authentication is stored in a query string parameter called
  410. ``"next"``. If you would prefer to use a different name for this parameter,
  411. :func:`~django.contrib.auth.decorators.login_required` takes an
  412. optional ``redirect_field_name`` parameter::
  413. from django.contrib.auth.decorators import login_required
  414. @login_required(redirect_field_name="my_redirect_field")
  415. def my_view(request):
  416. ...
  417. Note that if you provide a value to ``redirect_field_name``, you will most
  418. likely need to customize your login template as well, since the template
  419. context variable which stores the redirect path will use the value of
  420. ``redirect_field_name`` as its key rather than ``"next"`` (the default).
  421. :func:`~django.contrib.auth.decorators.login_required` also takes an
  422. optional ``login_url`` parameter. Example::
  423. from django.contrib.auth.decorators import login_required
  424. @login_required(login_url="/accounts/login/")
  425. def my_view(request):
  426. ...
  427. Note that if you don't specify the ``login_url`` parameter, you'll need to
  428. ensure that the :setting:`settings.LOGIN_URL <LOGIN_URL>` and your login
  429. view are properly associated. For example, using the defaults, add the
  430. following lines to your URLconf::
  431. from django.contrib.auth import views as auth_views
  432. path("accounts/login/", auth_views.LoginView.as_view()),
  433. The :setting:`settings.LOGIN_URL <LOGIN_URL>` also accepts view function
  434. names and :ref:`named URL patterns <naming-url-patterns>`. This allows you
  435. to freely remap your login view within your URLconf without having to
  436. update the setting.
  437. .. note::
  438. The ``login_required`` decorator does NOT check the ``is_active`` flag on a
  439. user, but the default :setting:`AUTHENTICATION_BACKENDS` reject inactive
  440. users.
  441. .. seealso::
  442. If you are writing custom views for Django's admin (or need the same
  443. authorization check that the built-in views use), you may find the
  444. :func:`django.contrib.admin.views.decorators.staff_member_required`
  445. decorator a useful alternative to ``login_required()``.
  446. .. currentmodule:: django.contrib.auth.mixins
  447. The ``LoginRequiredMixin`` mixin
  448. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  449. When using :doc:`class-based views </topics/class-based-views/index>`, you can
  450. achieve the same behavior as with ``login_required`` by using the
  451. ``LoginRequiredMixin``. This mixin should be at the leftmost position in the
  452. inheritance list.
  453. .. class:: LoginRequiredMixin
  454. If a view is using this mixin, all requests by non-authenticated users will
  455. be redirected to the login page or shown an HTTP 403 Forbidden error,
  456. depending on the
  457. :attr:`~django.contrib.auth.mixins.AccessMixin.raise_exception` parameter.
  458. You can set any of the parameters of
  459. :class:`~django.contrib.auth.mixins.AccessMixin` to customize the handling
  460. of unauthorized users::
  461. from django.contrib.auth.mixins import LoginRequiredMixin
  462. class MyView(LoginRequiredMixin, View):
  463. login_url = "/login/"
  464. redirect_field_name = "redirect_to"
  465. .. note::
  466. Just as the ``login_required`` decorator, this mixin does NOT check the
  467. ``is_active`` flag on a user, but the default
  468. :setting:`AUTHENTICATION_BACKENDS` reject inactive users.
  469. .. currentmodule:: django.contrib.auth.decorators
  470. Limiting access to logged-in users that pass a test
  471. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  472. To limit access based on certain permissions or some other test, you'd do
  473. essentially the same thing as described in the previous section.
  474. You can run your test on :attr:`request.user <django.http.HttpRequest.user>` in
  475. the view directly. For example, this view checks to make sure the user has an
  476. email in the desired domain and if not, redirects to the login page::
  477. from django.shortcuts import redirect
  478. def my_view(request):
  479. if not request.user.email.endswith("@example.com"):
  480. return redirect("/login/?next=%s" % request.path)
  481. # ...
  482. .. function:: user_passes_test(test_func, login_url=None, redirect_field_name='next')
  483. As a shortcut, you can use the convenient ``user_passes_test`` decorator
  484. which performs a redirect when the callable returns ``False``::
  485. from django.contrib.auth.decorators import user_passes_test
  486. def email_check(user):
  487. return user.email.endswith("@example.com")
  488. @user_passes_test(email_check)
  489. def my_view(request):
  490. ...
  491. :func:`~django.contrib.auth.decorators.user_passes_test` takes a required
  492. argument: a callable that takes a
  493. :class:`~django.contrib.auth.models.User` object and returns ``True`` if
  494. the user is allowed to view the page. Note that
  495. :func:`~django.contrib.auth.decorators.user_passes_test` does not
  496. automatically check that the :class:`~django.contrib.auth.models.User` is
  497. not anonymous.
  498. :func:`~django.contrib.auth.decorators.user_passes_test` takes two
  499. optional arguments:
  500. ``login_url``
  501. Lets you specify the URL that users who don't pass the test will be
  502. redirected to. It may be a login page and defaults to
  503. :setting:`settings.LOGIN_URL <LOGIN_URL>` if you don't specify one.
  504. ``redirect_field_name``
  505. Same as for :func:`~django.contrib.auth.decorators.login_required`.
  506. Setting it to ``None`` removes it from the URL, which you may want to do
  507. if you are redirecting users that don't pass the test to a non-login
  508. page where there's no "next page".
  509. For example::
  510. @user_passes_test(email_check, login_url="/login/")
  511. def my_view(request):
  512. ...
  513. .. currentmodule:: django.contrib.auth.mixins
  514. .. class:: UserPassesTestMixin
  515. When using :doc:`class-based views </topics/class-based-views/index>`, you
  516. can use the ``UserPassesTestMixin`` to do this.
  517. .. method:: test_func()
  518. You have to override the ``test_func()`` method of the class to
  519. provide the test that is performed. Furthermore, you can set any of the
  520. parameters of :class:`~django.contrib.auth.mixins.AccessMixin` to
  521. customize the handling of unauthorized users::
  522. from django.contrib.auth.mixins import UserPassesTestMixin
  523. class MyView(UserPassesTestMixin, View):
  524. def test_func(self):
  525. return self.request.user.email.endswith("@example.com")
  526. .. method:: get_test_func()
  527. You can also override the ``get_test_func()`` method to have the mixin
  528. use a differently named function for its checks (instead of
  529. :meth:`test_func`).
  530. .. admonition:: Stacking ``UserPassesTestMixin``
  531. Due to the way ``UserPassesTestMixin`` is implemented, you cannot stack
  532. them in your inheritance list. The following does NOT work::
  533. class TestMixin1(UserPassesTestMixin):
  534. def test_func(self):
  535. return self.request.user.email.endswith("@example.com")
  536. class TestMixin2(UserPassesTestMixin):
  537. def test_func(self):
  538. return self.request.user.username.startswith("django")
  539. class MyView(TestMixin1, TestMixin2, View):
  540. ...
  541. If ``TestMixin1`` would call ``super()`` and take that result into
  542. account, ``TestMixin1`` wouldn't work standalone anymore.
  543. .. currentmodule:: django.contrib.auth.decorators
  544. The ``permission_required`` decorator
  545. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  546. .. function:: permission_required(perm, login_url=None, raise_exception=False)
  547. It's a relatively common task to check whether a user has a particular
  548. permission. For that reason, Django provides a shortcut for that case: the
  549. :func:`~django.contrib.auth.decorators.permission_required()` decorator.::
  550. from django.contrib.auth.decorators import permission_required
  551. @permission_required("polls.add_choice")
  552. def my_view(request):
  553. ...
  554. Just like the :meth:`~django.contrib.auth.models.User.has_perm` method,
  555. permission names take the form ``"<app label>.<permission codename>"``
  556. (i.e. ``polls.add_choice`` for a permission on a model in the ``polls``
  557. application).
  558. The decorator may also take an iterable of permissions, in which case the
  559. user must have all of the permissions in order to access the view.
  560. Note that :func:`~django.contrib.auth.decorators.permission_required()`
  561. also takes an optional ``login_url`` parameter::
  562. from django.contrib.auth.decorators import permission_required
  563. @permission_required("polls.add_choice", login_url="/loginpage/")
  564. def my_view(request):
  565. ...
  566. As in the :func:`~django.contrib.auth.decorators.login_required` decorator,
  567. ``login_url`` defaults to :setting:`settings.LOGIN_URL <LOGIN_URL>`.
  568. If the ``raise_exception`` parameter is given, the decorator will raise
  569. :exc:`~django.core.exceptions.PermissionDenied`, prompting :ref:`the 403
  570. (HTTP Forbidden) view<http_forbidden_view>` instead of redirecting to the
  571. login page.
  572. If you want to use ``raise_exception`` but also give your users a chance to
  573. login first, you can add the
  574. :func:`~django.contrib.auth.decorators.login_required` decorator::
  575. from django.contrib.auth.decorators import login_required, permission_required
  576. @login_required
  577. @permission_required("polls.add_choice", raise_exception=True)
  578. def my_view(request):
  579. ...
  580. This also avoids a redirect loop when :class:`.LoginView`'s
  581. ``redirect_authenticated_user=True`` and the logged-in user doesn't have
  582. all of the required permissions.
  583. .. currentmodule:: django.contrib.auth.mixins
  584. The ``PermissionRequiredMixin`` mixin
  585. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  586. To apply permission checks to :doc:`class-based views
  587. </ref/class-based-views/index>`, you can use the ``PermissionRequiredMixin``:
  588. .. class:: PermissionRequiredMixin
  589. This mixin, just like the ``permission_required``
  590. decorator, checks whether the user accessing a view has all given
  591. permissions. You should specify the permission (or an iterable of
  592. permissions) using the ``permission_required`` parameter::
  593. from django.contrib.auth.mixins import PermissionRequiredMixin
  594. class MyView(PermissionRequiredMixin, View):
  595. permission_required = "polls.add_choice"
  596. # Or multiple of permissions:
  597. permission_required = ["polls.view_choice", "polls.change_choice"]
  598. You can set any of the parameters of
  599. :class:`~django.contrib.auth.mixins.AccessMixin` to customize the handling
  600. of unauthorized users.
  601. You may also override these methods:
  602. .. method:: get_permission_required()
  603. Returns an iterable of permission names used by the mixin. Defaults to
  604. the ``permission_required`` attribute, converted to a tuple if
  605. necessary.
  606. .. method:: has_permission()
  607. Returns a boolean denoting whether the current user has permission to
  608. execute the decorated view. By default, this returns the result of
  609. calling :meth:`~django.contrib.auth.models.User.has_perms()` with the
  610. list of permissions returned by :meth:`get_permission_required()`.
  611. Redirecting unauthorized requests in class-based views
  612. ------------------------------------------------------
  613. To ease the handling of access restrictions in :doc:`class-based views
  614. </ref/class-based-views/index>`, the ``AccessMixin`` can be used to configure
  615. the behavior of a view when access is denied. Authenticated users are denied
  616. access with an HTTP 403 Forbidden response. Anonymous users are redirected to
  617. the login page or shown an HTTP 403 Forbidden response, depending on the
  618. :attr:`~django.contrib.auth.mixins.AccessMixin.raise_exception` attribute.
  619. .. class:: AccessMixin
  620. .. attribute:: login_url
  621. Default return value for :meth:`get_login_url`. Defaults to ``None``
  622. in which case :meth:`get_login_url` falls back to
  623. :setting:`settings.LOGIN_URL <LOGIN_URL>`.
  624. .. attribute:: permission_denied_message
  625. Default return value for :meth:`get_permission_denied_message`.
  626. Defaults to an empty string.
  627. .. attribute:: redirect_field_name
  628. Default return value for :meth:`get_redirect_field_name`. Defaults to
  629. ``"next"``.
  630. .. attribute:: raise_exception
  631. If this attribute is set to ``True``, a
  632. :class:`~django.core.exceptions.PermissionDenied` exception is raised
  633. when the conditions are not met. When ``False`` (the default),
  634. anonymous users are redirected to the login page.
  635. .. method:: get_login_url()
  636. Returns the URL that users who don't pass the test will be redirected
  637. to. Returns :attr:`login_url` if set, or :setting:`settings.LOGIN_URL
  638. <LOGIN_URL>` otherwise.
  639. .. method:: get_permission_denied_message()
  640. When :attr:`raise_exception` is ``True``, this method can be used to
  641. control the error message passed to the error handler for display to
  642. the user. Returns the :attr:`permission_denied_message` attribute by
  643. default.
  644. .. method:: get_redirect_field_name()
  645. Returns the name of the query parameter that will contain the URL the
  646. user should be redirected to after a successful login. If you set this
  647. to ``None``, a query parameter won't be added. Returns the
  648. :attr:`redirect_field_name` attribute by default.
  649. .. method:: handle_no_permission()
  650. Depending on the value of ``raise_exception``, the method either raises
  651. a :exc:`~django.core.exceptions.PermissionDenied` exception or
  652. redirects the user to the ``login_url``, optionally including the
  653. ``redirect_field_name`` if it is set.
  654. .. currentmodule:: django.contrib.auth
  655. .. _session-invalidation-on-password-change:
  656. Session invalidation on password change
  657. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  658. If your :setting:`AUTH_USER_MODEL` inherits from
  659. :class:`~django.contrib.auth.models.AbstractBaseUser` or implements its own
  660. :meth:`~django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash()`
  661. method, authenticated sessions will include the hash returned by this function.
  662. In the :class:`~django.contrib.auth.models.AbstractBaseUser` case, this is an
  663. HMAC of the password field. Django verifies that the hash in the session for
  664. each request matches the one that's computed during the request. This allows a
  665. user to log out all of their sessions by changing their password.
  666. The default password change views included with Django,
  667. :class:`~django.contrib.auth.views.PasswordChangeView` and the
  668. ``user_change_password`` view in the :mod:`django.contrib.auth` admin, update
  669. the session with the new password hash so that a user changing their own
  670. password won't log themselves out. If you have a custom password change view
  671. and wish to have similar behavior, use the :func:`update_session_auth_hash`
  672. function.
  673. .. function:: update_session_auth_hash(request, user)
  674. This function takes the current request and the updated user object from
  675. which the new session hash will be derived and updates the session hash
  676. appropriately. It also rotates the session key so that a stolen session
  677. cookie will be invalidated.
  678. Example usage::
  679. from django.contrib.auth import update_session_auth_hash
  680. def password_change(request):
  681. if request.method == "POST":
  682. form = PasswordChangeForm(user=request.user, data=request.POST)
  683. if form.is_valid():
  684. form.save()
  685. update_session_auth_hash(request, form.user)
  686. else:
  687. ...
  688. .. note::
  689. Since
  690. :meth:`~django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash()`
  691. is based on :setting:`SECRET_KEY`, secret key values must be
  692. rotated to avoid invalidating existing sessions when updating your site to
  693. use a new secret. See :setting:`SECRET_KEY_FALLBACKS` for details.
  694. .. _built-in-auth-views:
  695. Authentication Views
  696. --------------------
  697. .. module:: django.contrib.auth.views
  698. Django provides several views that you can use for handling login, logout, and
  699. password management. These make use of the :ref:`stock auth forms
  700. <built-in-auth-forms>` but you can pass in your own forms as well.
  701. Django provides no default template for the authentication views. You should
  702. create your own templates for the views you want to use. The template context
  703. is documented in each view, see :ref:`all-authentication-views`.
  704. .. _using-the-views:
  705. Using the views
  706. ~~~~~~~~~~~~~~~
  707. There are different methods to implement these views in your project. The
  708. easiest way is to include the provided URLconf in ``django.contrib.auth.urls``
  709. in your own URLconf, for example::
  710. urlpatterns = [
  711. path("accounts/", include("django.contrib.auth.urls")),
  712. ]
  713. This will include the following URL patterns:
  714. .. code-block:: text
  715. accounts/login/ [name='login']
  716. accounts/logout/ [name='logout']
  717. accounts/password_change/ [name='password_change']
  718. accounts/password_change/done/ [name='password_change_done']
  719. accounts/password_reset/ [name='password_reset']
  720. accounts/password_reset/done/ [name='password_reset_done']
  721. accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
  722. accounts/reset/done/ [name='password_reset_complete']
  723. The views provide a URL name for easier reference. See :doc:`the URL
  724. documentation </topics/http/urls>` for details on using named URL patterns.
  725. If you want more control over your URLs, you can reference a specific view in
  726. your URLconf::
  727. from django.contrib.auth import views as auth_views
  728. urlpatterns = [
  729. path("change-password/", auth_views.PasswordChangeView.as_view()),
  730. ]
  731. The views have optional arguments you can use to alter the behavior of the
  732. view. For example, if you want to change the template name a view uses, you can
  733. provide the ``template_name`` argument. A way to do this is to provide keyword
  734. arguments in the URLconf, these will be passed on to the view. For example::
  735. urlpatterns = [
  736. path(
  737. "change-password/",
  738. auth_views.PasswordChangeView.as_view(template_name="change-password.html"),
  739. ),
  740. ]
  741. All views are :doc:`class-based </topics/class-based-views/index>`, which allows
  742. you to easily customize them by subclassing.
  743. .. _all-authentication-views:
  744. All authentication views
  745. ~~~~~~~~~~~~~~~~~~~~~~~~
  746. This is a list with all the views ``django.contrib.auth`` provides. For
  747. implementation details see :ref:`using-the-views`.
  748. .. class:: LoginView
  749. **URL name:** ``login``
  750. See :doc:`the URL documentation </topics/http/urls>` for details on using
  751. named URL patterns.
  752. **Methods and Attributes**
  753. .. attribute:: template_name
  754. The name of a template to display for the view used to log the user in.
  755. Defaults to :file:`registration/login.html`.
  756. .. attribute:: next_page
  757. The URL to redirect to after login. Defaults to
  758. :setting:`LOGIN_REDIRECT_URL`.
  759. .. attribute:: redirect_field_name
  760. The name of a ``GET`` field containing the URL to redirect to after
  761. login. Defaults to ``next``. Overrides the
  762. :meth:`get_default_redirect_url` URL if the given ``GET`` parameter is
  763. passed.
  764. .. attribute:: authentication_form
  765. A callable (typically a form class) to use for authentication. Defaults
  766. to :class:`~django.contrib.auth.forms.AuthenticationForm`.
  767. .. attribute:: extra_context
  768. A dictionary of context data that will be added to the default context
  769. data passed to the template.
  770. .. attribute:: redirect_authenticated_user
  771. A boolean that controls whether or not authenticated users accessing
  772. the login page will be redirected as if they had just successfully
  773. logged in. Defaults to ``False``.
  774. .. warning::
  775. If you enable ``redirect_authenticated_user``, other websites will
  776. be able to determine if their visitors are authenticated on your
  777. site by requesting redirect URLs to image files on your website. To
  778. avoid this "`social media fingerprinting
  779. <https://robinlinus.github.io/socialmedia-leak/>`_" information
  780. leakage, host all images and your favicon on a separate domain.
  781. Enabling ``redirect_authenticated_user`` can also result in a
  782. redirect loop when using the :func:`.permission_required` decorator
  783. unless the ``raise_exception`` parameter is used.
  784. .. attribute:: success_url_allowed_hosts
  785. A :class:`set` of hosts, in addition to :meth:`request.get_host()
  786. <django.http.HttpRequest.get_host>`, that are safe for redirecting
  787. after login. Defaults to an empty :class:`set`.
  788. .. method:: get_default_redirect_url()
  789. Returns the URL to redirect to after login. The default implementation
  790. resolves and returns :attr:`next_page` if set, or
  791. :setting:`LOGIN_REDIRECT_URL` otherwise.
  792. Here's what ``LoginView`` does:
  793. * If called via ``GET``, it displays a login form that POSTs to the
  794. same URL. More on this in a bit.
  795. * If called via ``POST`` with user submitted credentials, it tries to log
  796. the user in. If login is successful, the view redirects to the URL
  797. specified in ``next``. If ``next`` isn't provided, it redirects to
  798. :setting:`settings.LOGIN_REDIRECT_URL <LOGIN_REDIRECT_URL>` (which
  799. defaults to ``/accounts/profile/``). If login isn't successful, it
  800. redisplays the login form.
  801. It's your responsibility to provide the html for the login template
  802. , called ``registration/login.html`` by default. This template gets passed
  803. four template context variables:
  804. * ``form``: A :class:`~django.forms.Form` object representing the
  805. :class:`~django.contrib.auth.forms.AuthenticationForm`.
  806. * ``next``: The URL to redirect to after successful login. This may
  807. contain a query string, too.
  808. * ``site``: The current :class:`~django.contrib.sites.models.Site`,
  809. according to the :setting:`SITE_ID` setting. If you don't have the
  810. site framework installed, this will be set to an instance of
  811. :class:`~django.contrib.sites.requests.RequestSite`, which derives the
  812. site name and domain from the current
  813. :class:`~django.http.HttpRequest`.
  814. * ``site_name``: An alias for ``site.name``. If you don't have the site
  815. framework installed, this will be set to the value of
  816. :attr:`request.META['SERVER_NAME'] <django.http.HttpRequest.META>`.
  817. For more on sites, see :doc:`/ref/contrib/sites`.
  818. If you'd prefer not to call the template :file:`registration/login.html`,
  819. you can pass the ``template_name`` parameter via the extra arguments to
  820. the ``as_view`` method in your URLconf. For example, this URLconf line would
  821. use :file:`myapp/login.html` instead::
  822. path("accounts/login/", auth_views.LoginView.as_view(template_name="myapp/login.html")),
  823. You can also specify the name of the ``GET`` field which contains the URL
  824. to redirect to after login using ``redirect_field_name``. By default, the
  825. field is called ``next``.
  826. Here's a sample :file:`registration/login.html` template you can use as a
  827. starting point. It assumes you have a :file:`base.html` template that
  828. defines a ``content`` block:
  829. .. code-block:: html+django
  830. {% extends "base.html" %}
  831. {% block content %}
  832. {% if form.errors %}
  833. <p>Your username and password didn't match. Please try again.</p>
  834. {% endif %}
  835. {% if next %}
  836. {% if user.is_authenticated %}
  837. <p>Your account doesn't have access to this page. To proceed,
  838. please login with an account that has access.</p>
  839. {% else %}
  840. <p>Please login to see this page.</p>
  841. {% endif %}
  842. {% endif %}
  843. <form method="post" action="{% url 'login' %}">
  844. {% csrf_token %}
  845. <table>
  846. <tr>
  847. <td>{{ form.username.label_tag }}</td>
  848. <td>{{ form.username }}</td>
  849. </tr>
  850. <tr>
  851. <td>{{ form.password.label_tag }}</td>
  852. <td>{{ form.password }}</td>
  853. </tr>
  854. </table>
  855. <input type="submit" value="login">
  856. <input type="hidden" name="next" value="{{ next }}">
  857. </form>
  858. {# Assumes you set up the password_reset view in your URLconf #}
  859. <p><a href="{% url 'password_reset' %}">Lost password?</a></p>
  860. {% endblock %}
  861. If you have customized authentication (see :doc:`Customizing Authentication
  862. </topics/auth/customizing>`) you can use a custom authentication form by
  863. setting the ``authentication_form`` attribute. This form must accept a
  864. ``request`` keyword argument in its ``__init__()`` method and provide a
  865. ``get_user()`` method which returns the authenticated user object (this
  866. method is only ever called after successful form validation).
  867. .. class:: LogoutView
  868. Logs a user out on ``POST`` requests.
  869. **URL name:** ``logout``
  870. **Attributes:**
  871. .. attribute:: next_page
  872. The URL to redirect to after logout. Defaults to
  873. :setting:`LOGOUT_REDIRECT_URL`.
  874. .. attribute:: template_name
  875. The full name of a template to display after logging the user out.
  876. Defaults to :file:`registration/logged_out.html`.
  877. .. attribute:: redirect_field_name
  878. The name of a ``GET`` field containing the URL to redirect to after log
  879. out. Defaults to ``'next'``. Overrides the
  880. :attr:`next_page` URL if the given ``GET`` parameter is
  881. passed.
  882. .. attribute:: extra_context
  883. A dictionary of context data that will be added to the default context
  884. data passed to the template.
  885. .. attribute:: success_url_allowed_hosts
  886. A :class:`set` of hosts, in addition to :meth:`request.get_host()
  887. <django.http.HttpRequest.get_host>`, that are safe for redirecting
  888. after logout. Defaults to an empty :class:`set`.
  889. **Template context:**
  890. * ``title``: The string "Logged out", localized.
  891. * ``site``: The current :class:`~django.contrib.sites.models.Site`,
  892. according to the :setting:`SITE_ID` setting. If you don't have the
  893. site framework installed, this will be set to an instance of
  894. :class:`~django.contrib.sites.requests.RequestSite`, which derives the
  895. site name and domain from the current
  896. :class:`~django.http.HttpRequest`.
  897. * ``site_name``: An alias for ``site.name``. If you don't have the site
  898. framework installed, this will be set to the value of
  899. :attr:`request.META['SERVER_NAME'] <django.http.HttpRequest.META>`.
  900. For more on sites, see :doc:`/ref/contrib/sites`.
  901. .. function:: logout_then_login(request, login_url=None)
  902. Logs a user out on ``POST`` requests, then redirects to the login page.
  903. **URL name:** No default URL provided
  904. **Optional arguments:**
  905. * ``login_url``: The URL of the login page to redirect to.
  906. Defaults to :setting:`settings.LOGIN_URL <LOGIN_URL>` if not supplied.
  907. .. deprecated:: 4.1
  908. Support for logging out on ``GET`` requests is deprecated and will be
  909. removed in Django 5.0.
  910. .. class:: PasswordChangeView
  911. **URL name:** ``password_change``
  912. Allows a user to change their password.
  913. **Attributes:**
  914. .. attribute:: template_name
  915. The full name of a template to use for displaying the password change
  916. form. Defaults to :file:`registration/password_change_form.html` if not
  917. supplied.
  918. .. attribute:: success_url
  919. The URL to redirect to after a successful password change. Defaults to
  920. ``'password_change_done'``.
  921. .. attribute:: form_class
  922. A custom "change password" form which must accept a ``user`` keyword
  923. argument. The form is responsible for actually changing the user's
  924. password. Defaults to
  925. :class:`~django.contrib.auth.forms.PasswordChangeForm`.
  926. .. attribute:: extra_context
  927. A dictionary of context data that will be added to the default context
  928. data passed to the template.
  929. **Template context:**
  930. * ``form``: The password change form (see ``form_class`` above).
  931. .. class:: PasswordChangeDoneView
  932. **URL name:** ``password_change_done``
  933. The page shown after a user has changed their password.
  934. **Attributes:**
  935. .. attribute:: template_name
  936. The full name of a template to use. Defaults to
  937. :file:`registration/password_change_done.html` if not supplied.
  938. .. attribute:: extra_context
  939. A dictionary of context data that will be added to the default context
  940. data passed to the template.
  941. .. class:: PasswordResetView
  942. **URL name:** ``password_reset``
  943. Allows a user to reset their password by generating a one-time use link
  944. that can be used to reset the password, and sending that link to the
  945. user's registered email address.
  946. This view will send an email if the following conditions are met:
  947. * The email address provided exists in the system.
  948. * The requested user is active (``User.is_active`` is ``True``).
  949. * The requested user has a usable password. Users flagged with an unusable
  950. password (see
  951. :meth:`~django.contrib.auth.models.User.set_unusable_password`) aren't
  952. allowed to request a password reset to prevent misuse when using an
  953. external authentication source like LDAP.
  954. If any of these conditions are *not* met, no email will be sent, but the
  955. user won't receive any error message either. This prevents information
  956. leaking to potential attackers. If you want to provide an error message in
  957. this case, you can subclass
  958. :class:`~django.contrib.auth.forms.PasswordResetForm` and use the
  959. ``form_class`` attribute.
  960. .. note::
  961. Be aware that sending an email costs extra time, hence you may be
  962. vulnerable to an email address enumeration timing attack due to a
  963. difference between the duration of a reset request for an existing
  964. email address and the duration of a reset request for a nonexistent
  965. email address. To reduce the overhead, you can use a 3rd party package
  966. that allows to send emails asynchronously, e.g. `django-mailer
  967. <https://pypi.org/project/django-mailer/>`_.
  968. **Attributes:**
  969. .. attribute:: template_name
  970. The full name of a template to use for displaying the password reset
  971. form. Defaults to :file:`registration/password_reset_form.html` if not
  972. supplied.
  973. .. attribute:: form_class
  974. Form that will be used to get the email of the user to reset the
  975. password for. Defaults to
  976. :class:`~django.contrib.auth.forms.PasswordResetForm`.
  977. .. attribute:: email_template_name
  978. The full name of a template to use for generating the email with the
  979. reset password link. Defaults to
  980. :file:`registration/password_reset_email.html` if not supplied.
  981. .. attribute:: subject_template_name
  982. The full name of a template to use for the subject of the email with
  983. the reset password link. Defaults to
  984. :file:`registration/password_reset_subject.txt` if not supplied.
  985. .. attribute:: token_generator
  986. Instance of the class to check the one time link. This will default to
  987. ``default_token_generator``, it's an instance of
  988. ``django.contrib.auth.tokens.PasswordResetTokenGenerator``.
  989. .. attribute:: success_url
  990. The URL to redirect to after a successful password reset request.
  991. Defaults to ``'password_reset_done'``.
  992. .. attribute:: from_email
  993. A valid email address. By default Django uses the
  994. :setting:`DEFAULT_FROM_EMAIL`.
  995. .. attribute:: extra_context
  996. A dictionary of context data that will be added to the default context
  997. data passed to the template.
  998. .. attribute:: html_email_template_name
  999. The full name of a template to use for generating a
  1000. :mimetype:`text/html` multipart email with the password reset link. By
  1001. default, HTML email is not sent.
  1002. .. attribute:: extra_email_context
  1003. A dictionary of context data that will be available in the email
  1004. template. It can be used to override default template context values
  1005. listed below e.g. ``domain``.
  1006. **Template context:**
  1007. * ``form``: The form (see ``form_class`` above) for resetting the user's
  1008. password.
  1009. **Email template context:**
  1010. * ``email``: An alias for ``user.email``
  1011. * ``user``: The current :class:`~django.contrib.auth.models.User`,
  1012. according to the ``email`` form field. Only active users are able to
  1013. reset their passwords (``User.is_active is True``).
  1014. * ``site_name``: An alias for ``site.name``. If you don't have the site
  1015. framework installed, this will be set to the value of
  1016. :attr:`request.META['SERVER_NAME'] <django.http.HttpRequest.META>`.
  1017. For more on sites, see :doc:`/ref/contrib/sites`.
  1018. * ``domain``: An alias for ``site.domain``. If you don't have the site
  1019. framework installed, this will be set to the value of
  1020. ``request.get_host()``.
  1021. * ``protocol``: http or https
  1022. * ``uid``: The user's primary key encoded in base 64.
  1023. * ``token``: Token to check that the reset link is valid.
  1024. Sample ``registration/password_reset_email.html`` (email body template):
  1025. .. code-block:: html+django
  1026. Someone asked for password reset for email {{ email }}. Follow the link below:
  1027. {{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
  1028. The same template context is used for subject template. Subject must be
  1029. single line plain text string.
  1030. .. class:: PasswordResetDoneView
  1031. **URL name:** ``password_reset_done``
  1032. The page shown after a user has been emailed a link to reset their
  1033. password. This view is called by default if the :class:`PasswordResetView`
  1034. doesn't have an explicit ``success_url`` URL set.
  1035. .. note::
  1036. If the email address provided does not exist in the system, the user is
  1037. inactive, or has an unusable password, the user will still be
  1038. redirected to this view but no email will be sent.
  1039. **Attributes:**
  1040. .. attribute:: template_name
  1041. The full name of a template to use. Defaults to
  1042. :file:`registration/password_reset_done.html` if not supplied.
  1043. .. attribute:: extra_context
  1044. A dictionary of context data that will be added to the default context
  1045. data passed to the template.
  1046. .. class:: PasswordResetConfirmView
  1047. **URL name:** ``password_reset_confirm``
  1048. Presents a form for entering a new password.
  1049. **Keyword arguments from the URL:**
  1050. * ``uidb64``: The user's id encoded in base 64.
  1051. * ``token``: Token to check that the password is valid.
  1052. **Attributes:**
  1053. .. attribute:: template_name
  1054. The full name of a template to display the confirm password view.
  1055. Default value is :file:`registration/password_reset_confirm.html`.
  1056. .. attribute:: token_generator
  1057. Instance of the class to check the password. This will default to
  1058. ``default_token_generator``, it's an instance of
  1059. ``django.contrib.auth.tokens.PasswordResetTokenGenerator``.
  1060. .. attribute:: post_reset_login
  1061. A boolean indicating if the user should be automatically authenticated
  1062. after a successful password reset. Defaults to ``False``.
  1063. .. attribute:: post_reset_login_backend
  1064. A dotted path to the authentication backend to use when authenticating
  1065. a user if ``post_reset_login`` is ``True``. Required only if you have
  1066. multiple :setting:`AUTHENTICATION_BACKENDS` configured. Defaults to
  1067. ``None``.
  1068. .. attribute:: form_class
  1069. Form that will be used to set the password. Defaults to
  1070. :class:`~django.contrib.auth.forms.SetPasswordForm`.
  1071. .. attribute:: success_url
  1072. URL to redirect after the password reset done. Defaults to
  1073. ``'password_reset_complete'``.
  1074. .. attribute:: extra_context
  1075. A dictionary of context data that will be added to the default context
  1076. data passed to the template.
  1077. .. attribute:: reset_url_token
  1078. Token parameter displayed as a component of password reset URLs.
  1079. Defaults to ``'set-password'``.
  1080. **Template context:**
  1081. * ``form``: The form (see ``form_class`` above) for setting the new user's
  1082. password.
  1083. * ``validlink``: Boolean, True if the link (combination of ``uidb64`` and
  1084. ``token``) is valid or unused yet.
  1085. .. class:: PasswordResetCompleteView
  1086. **URL name:** ``password_reset_complete``
  1087. Presents a view which informs the user that the password has been
  1088. successfully changed.
  1089. **Attributes:**
  1090. .. attribute:: template_name
  1091. The full name of a template to display the view. Defaults to
  1092. :file:`registration/password_reset_complete.html`.
  1093. .. attribute:: extra_context
  1094. A dictionary of context data that will be added to the default context
  1095. data passed to the template.
  1096. Helper functions
  1097. ----------------
  1098. .. currentmodule:: django.contrib.auth.views
  1099. .. function:: redirect_to_login(next, login_url=None, redirect_field_name='next')
  1100. Redirects to the login page, and then back to another URL after a
  1101. successful login.
  1102. **Required arguments:**
  1103. * ``next``: The URL to redirect to after a successful login.
  1104. **Optional arguments:**
  1105. * ``login_url``: The URL of the login page to redirect to.
  1106. Defaults to :setting:`settings.LOGIN_URL <LOGIN_URL>` if not supplied.
  1107. * ``redirect_field_name``: The name of a ``GET`` field containing the
  1108. URL to redirect to after log out. Overrides ``next`` if the given
  1109. ``GET`` parameter is passed.
  1110. .. _built-in-auth-forms:
  1111. Built-in forms
  1112. --------------
  1113. .. module:: django.contrib.auth.forms
  1114. If you don't want to use the built-in views, but want the convenience of not
  1115. having to write forms for this functionality, the authentication system
  1116. provides several built-in forms located in :mod:`django.contrib.auth.forms`:
  1117. .. note::
  1118. The built-in authentication forms make certain assumptions about the user
  1119. model that they are working with. If you're using a :ref:`custom user model
  1120. <auth-custom-user>`, it may be necessary to define your own forms for the
  1121. authentication system. For more information, refer to the documentation
  1122. about :ref:`using the built-in authentication forms with custom user models
  1123. <custom-users-and-the-built-in-auth-forms>`.
  1124. .. class:: AdminPasswordChangeForm
  1125. A form used in the admin interface to change a user's password.
  1126. Takes the ``user`` as the first positional argument.
  1127. .. class:: AuthenticationForm
  1128. A form for logging a user in.
  1129. Takes ``request`` as its first positional argument, which is stored on the
  1130. form instance for use by sub-classes.
  1131. .. method:: confirm_login_allowed(user)
  1132. By default, ``AuthenticationForm`` rejects users whose ``is_active``
  1133. flag is set to ``False``. You may override this behavior with a custom
  1134. policy to determine which users can log in. Do this with a custom form
  1135. that subclasses ``AuthenticationForm`` and overrides the
  1136. ``confirm_login_allowed()`` method. This method should raise a
  1137. :exc:`~django.core.exceptions.ValidationError` if the given user may
  1138. not log in.
  1139. For example, to allow all users to log in regardless of "active"
  1140. status::
  1141. from django.contrib.auth.forms import AuthenticationForm
  1142. class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm):
  1143. def confirm_login_allowed(self, user):
  1144. pass
  1145. (In this case, you'll also need to use an authentication backend that
  1146. allows inactive users, such as
  1147. :class:`~django.contrib.auth.backends.AllowAllUsersModelBackend`.)
  1148. Or to allow only some active users to log in::
  1149. class PickyAuthenticationForm(AuthenticationForm):
  1150. def confirm_login_allowed(self, user):
  1151. if not user.is_active:
  1152. raise ValidationError(
  1153. _("This account is inactive."),
  1154. code="inactive",
  1155. )
  1156. if user.username.startswith("b"):
  1157. raise ValidationError(
  1158. _("Sorry, accounts starting with 'b' aren't welcome here."),
  1159. code="no_b_users",
  1160. )
  1161. .. class:: PasswordChangeForm
  1162. A form for allowing a user to change their password.
  1163. .. class:: PasswordResetForm
  1164. A form for generating and emailing a one-time use link to reset a
  1165. user's password.
  1166. .. method:: send_mail(subject_template_name, email_template_name, context, from_email, to_email, html_email_template_name=None)
  1167. Uses the arguments to send an ``EmailMultiAlternatives``.
  1168. Can be overridden to customize how the email is sent to the user.
  1169. :param subject_template_name: the template for the subject.
  1170. :param email_template_name: the template for the email body.
  1171. :param context: context passed to the ``subject_template``,
  1172. ``email_template``, and ``html_email_template`` (if it is not
  1173. ``None``).
  1174. :param from_email: the sender's email.
  1175. :param to_email: the email of the requester.
  1176. :param html_email_template_name: the template for the HTML body;
  1177. defaults to ``None``, in which case a plain text email is sent.
  1178. By default, ``save()`` populates the ``context`` with the
  1179. same variables that
  1180. :class:`~django.contrib.auth.views.PasswordResetView` passes to its
  1181. email context.
  1182. .. class:: SetPasswordForm
  1183. A form that lets a user change their password without entering the old
  1184. password.
  1185. .. class:: UserChangeForm
  1186. A form used in the admin interface to change a user's information and
  1187. permissions.
  1188. .. class:: BaseUserCreationForm
  1189. .. versionadded:: 4.2
  1190. A :class:`~django.forms.ModelForm` for creating a new user. This is the
  1191. recommended base class if you need to customize the user creation form.
  1192. It has three fields: ``username`` (from the user model), ``password1``,
  1193. and ``password2``. It verifies that ``password1`` and ``password2`` match,
  1194. validates the password using
  1195. :func:`~django.contrib.auth.password_validation.validate_password`, and
  1196. sets the user's password using
  1197. :meth:`~django.contrib.auth.models.User.set_password()`.
  1198. .. class:: UserCreationForm
  1199. Inherits from :class:`BaseUserCreationForm`. To help prevent confusion with
  1200. similar usernames, the form doesn't allow usernames that differ only in
  1201. case.
  1202. .. versionchanged:: 4.2
  1203. In older versions, :class:`UserCreationForm` didn't save many-to-many
  1204. form fields for a custom user model.
  1205. In older versions, usernames that differ only in case are allowed.
  1206. .. currentmodule:: django.contrib.auth
  1207. Authentication data in templates
  1208. --------------------------------
  1209. The currently logged-in user and their permissions are made available in the
  1210. :doc:`template context </ref/templates/api>` when you use
  1211. :class:`~django.template.RequestContext`.
  1212. .. admonition:: Technicality
  1213. Technically, these variables are only made available in the template
  1214. context if you use :class:`~django.template.RequestContext` and the
  1215. ``'django.contrib.auth.context_processors.auth'`` context processor is
  1216. enabled. It is in the default generated settings file. For more, see the
  1217. :ref:`RequestContext docs <subclassing-context-requestcontext>`.
  1218. Users
  1219. ~~~~~
  1220. When rendering a template :class:`~django.template.RequestContext`, the
  1221. currently logged-in user, either a :class:`~django.contrib.auth.models.User`
  1222. instance or an :class:`~django.contrib.auth.models.AnonymousUser` instance, is
  1223. stored in the template variable ``{{ user }}``:
  1224. .. code-block:: html+django
  1225. {% if user.is_authenticated %}
  1226. <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
  1227. {% else %}
  1228. <p>Welcome, new user. Please log in.</p>
  1229. {% endif %}
  1230. This template context variable is not available if a ``RequestContext`` is not
  1231. being used.
  1232. Permissions
  1233. ~~~~~~~~~~~
  1234. The currently logged-in user's permissions are stored in the template variable
  1235. ``{{ perms }}``. This is an instance of
  1236. ``django.contrib.auth.context_processors.PermWrapper``, which is a
  1237. template-friendly proxy of permissions.
  1238. Evaluating a single-attribute lookup of ``{{ perms }}`` as a boolean is a proxy
  1239. to :meth:`User.has_module_perms()
  1240. <django.contrib.auth.models.User.has_module_perms>`. For example, to check if
  1241. the logged-in user has any permissions in the ``foo`` app:
  1242. .. code-block:: html+django
  1243. {% if perms.foo %}
  1244. Evaluating a two-level-attribute lookup as a boolean is a proxy to
  1245. :meth:`User.has_perm() <django.contrib.auth.models.User.has_perm>`. For example,
  1246. to check if the logged-in user has the permission ``foo.add_vote``:
  1247. .. code-block:: html+django
  1248. {% if perms.foo.add_vote %}
  1249. Here's a more complete example of checking permissions in a template:
  1250. .. code-block:: html+django
  1251. {% if perms.foo %}
  1252. <p>You have permission to do something in the foo app.</p>
  1253. {% if perms.foo.add_vote %}
  1254. <p>You can vote!</p>
  1255. {% endif %}
  1256. {% if perms.foo.add_driving %}
  1257. <p>You can drive!</p>
  1258. {% endif %}
  1259. {% else %}
  1260. <p>You don't have permission to do anything in the foo app.</p>
  1261. {% endif %}
  1262. It is possible to also look permissions up by ``{% if in %}`` statements.
  1263. For example:
  1264. .. code-block:: html+django
  1265. {% if 'foo' in perms %}
  1266. {% if 'foo.add_vote' in perms %}
  1267. <p>In lookup works, too.</p>
  1268. {% endif %}
  1269. {% endif %}
  1270. .. _auth-admin:
  1271. Managing users in the admin
  1272. ===========================
  1273. When you have both ``django.contrib.admin`` and ``django.contrib.auth``
  1274. installed, the admin provides a convenient way to view and manage users,
  1275. groups, and permissions. Users can be created and deleted like any Django
  1276. model. Groups can be created, and permissions can be assigned to users or
  1277. groups. A log of user edits to models made within the admin is also stored and
  1278. displayed.
  1279. Creating users
  1280. --------------
  1281. You should see a link to "Users" in the "Auth"
  1282. section of the main admin index page. The "Add user" admin page is different
  1283. than standard admin pages in that it requires you to choose a username and
  1284. password before allowing you to edit the rest of the user's fields.
  1285. Also note: if you want a user account to be able to create users using the
  1286. Django admin site, you'll need to give them permission to add users *and*
  1287. change users (i.e., the "Add user" and "Change user" permissions). If an
  1288. account has permission to add users but not to change them, that account won't
  1289. be able to add users. Why? Because if you have permission to add users, you
  1290. have the power to create superusers, which can then, in turn, change other
  1291. users. So Django requires add *and* change permissions as a slight security
  1292. measure.
  1293. Be thoughtful about how you allow users to manage permissions. If you give a
  1294. non-superuser the ability to edit users, this is ultimately the same as giving
  1295. them superuser status because they will be able to elevate permissions of
  1296. users including themselves!
  1297. Changing passwords
  1298. ------------------
  1299. User passwords are not displayed in the admin (nor stored in the database), but
  1300. the :doc:`password storage details </topics/auth/passwords>` are displayed.
  1301. Included in the display of this information is a link to
  1302. a password change form that allows admins to change user passwords.