summaryrefslogtreecommitdiff
path: root/docs/lib/passlib.ext.django.rst
blob: d797e235f39821f9b90c663b2797bbfa8c14aa59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
.. index:: django; password hashing app

==================================================
:mod:`passlib.ext.django` - Django Password Helper
==================================================

.. module:: passlib.ext.django

.. warning::

    This submodule should be considered "release candidate" quality.
    It works, and has good unittest coverage,
    but has not seen very much real-world use.
    *caveat emptor*, and please report any issues.

    This module is currently not compatible with Django 1.4's new
    password hashing system, or formats.

.. todo::

    This documentation needs to be cleaned up significantly
    for new users.

Overview
========
This module is intended for use with
`Django <http://www.djangoproject.com>`_-based web applications.
It contains a Django app which allows you to override
Django's builtin password hashing routines
to use any Passlib :doc:`CryptContext <passlib.context>` configuration.
It provides the following features:

* Custom configurations allow the use of any password hash supported by Passlib.
* Increased-strength hashing for staff and admin accounts.
* Automatically upgrading of deprecated and weaker hashes.
* Default configuration supports all standard Django hash formats,
  and automatically upgrades all hashes to use :class:`~passlib.hash.sha512_crypt`
  (upgrades only occur when the user logs in or changes their password).
* Tested against Django 0.9 - 1.3

Installation
=============
Installation is simple: once Passlib is installed, just add
``"passlib.ext.django"`` to Django's ``settings.INSTALLED_APPS``.
This app will handle everything else.

Once installed, when this app is imported by Django, it will automatically monkeypatch
:class:`!django.contrib.auth.models.User` to use a Passlib
:class:`~passlib.context.CryptContext` instance in place of the normal Django
password authentication routines.
This provides hash migration, the ability to set stronger policies
for superuser & staff passwords, and stronger password hashing schemes.

Configuration
=============
While the default configuration should be secure, once installed,
you may set the following options in django ``settings.py``:

``PASSLIB_CONTEXT``
   This may be one of a number of values:

   * The string ``"passlib-default"``, which will cause Passlib
     to replace Django's hash routines with a builtin policy
     that supports all existing django hashes; but as users
     log in, upgrades them all to :class:`~passlib.hash.pbkdf2_sha256`.
     It also supports stronger hashing for the superuser account.

     This is the default behavior if ``PASSLIB_CONTEXT`` is not set.

     The exact default policy used can be found in
     :data:`~passlib.ext.django.utils.DEFAULT_CTX`.

   * ``"disabled"``, in which case this app will do nothing when Django is loaded.

   * A multiline configuration string suitable for passing to
     :meth:`passlib.context.CryptContext.from_string`.
     It is *strongly* recommended to use a configuration which will support
     the existing Django hashes
     (see :data:`~passlib.ext.django.utils.STOCK_CTX`).

``PASSLIB_GET_CATEGORY``

   By default, Passlib will invoke the specified context with a category
   string that's dependant on the User instance.  superusers will be assigned
   to the ``superuser`` category, staff to the ``staff`` category, and all
   other accounts assigned to ``None``.

   This configuration option allows overriding that logic
   by specifying an alternate function with the call signature
   ``get_category(user) -> category|None``.

   .. seealso::

        See :ref:`user-categories` for more details about
        the category system in Passlib.

Utility Functions
=================
.. module:: passlib.ext.django.utils

Whether or not you install this application into Django,
the following utility functions are available for overriding
Django's password hashes:

.. data:: DEFAULT_CTX

    This is a string containing the default hashing policy
    that will be used by this application if none is specified
    via ``settings.PASSLIB_CONTEXT``.
    It defaults to the following::

        [passlib]
        schemes =
            sha512_crypt,
            django_salted_sha1, django_salted_md5,
            django_des_crypt, hex_md5,
            django_disabled

        default = sha512_crypt

        deprecated =
            django_salted_sha1, django_salted_md5,
            django_des_crypt, hex_md5

        all__vary_rounds = 5%%

        sha512_crypt__default_rounds = 15000
        staff__sha512_crypt__default_rounds = 25000
        superuser__sha512_crypt__default_rounds = 35000

.. data:: STOCK_CTX

    This is a string containing the a hashing policy
    which should be exactly the same as Django's default behavior.
    It is mainly useful as a template for building off of
    when defining your own custom hashing policy
    via ``settings.PASSLIB_CONTEXT``.
    It defaults to the following::

        [passlib]
        schemes =
            django_salted_sha1, django_salted_md5,
            django_des_crypt, hex_md5,
            django_disabled

        default = django_salted_sha1

        deprecated = hex_md5

.. autofunction:: get_category

.. autofunction:: set_django_password_context