---
title: Django
author: Steve Kossouho
---

# L'authentification et les utilisateurs

----

## L'application d'authentification de Django

Django fournit directement dans le framework une application de gestion de l'authentification, avec les modèles associés. Généralement, ces modèles sont utilisés dans tout projet Django, et reconnus par toutes les applications tierces Django qui utilisent l'authentification ou les utilisateurs.

Cette application est `django.contrib.auth`. Lorsqu'on l'utilise avec certains middleware ainsi que `django.contrib.session`, on a de bons outils pour se connecter en tant qu'une instance d'utilisateur de notre base.

----

## S'authentifier programmatiquement

Django fournit plusieurs fonctions pour se dé/connecter en tant qu'une instance de `User` :

(Dans `django.contrib.auth`)

- `authenticate`
- `login`
- `logout`

----

`authenticate` permet de savoir si des identifiants de connexion sont valides. Par exemple :

```python
from django.contrib.auth import login, logout, authenticate
user = authenticate(username="…", password="…")  # ou email
```

S'ils le sont, la fonction renvoie l'utilisateur concerné, sinon la fonction renvoie `None`.

----

`login` modifie la session HTTP pour indiquer que nous sommes connecté en tant qu'un utilisateur. (nous avons donc
besoin d'un objet `request`)

```python
from django.contrib.auth import login, logout, authenticate
login(request, user)  # user est une instance du modèle User
```

----

`logout` déconnecte tout utilisateur connecté dans la session.

----

Grâce aux middleware et aux processeurs de contexte, depuis les vues ou dans les templates, on peut accéder facilement à l'instance de l'utilisateur actuellement connecté :

```python
def view(request):
    print(request.user)
```

```djangotemplate
{{ user }} {# ou request.user puisque request est aussi dispo #}
```

----

## S'authentifier avec un formulaire

Django propose plusieurs vues pour gérer l'authentification, qui rendent des templates trouvés dans un répertoire `registration` (qu'il faut généralement redéfinir pour adapter le rendu de la page et du formulaire).

On peut aussi s'authentifier manuellement en créant une simple vue utilisant un formulaire standard...

----

Ce formulaire utiliserait `authenticate` pour valider les champs et afficher une erreur si nécessaire. La vue réutiliserait `authenticate` une fois le formulaire valide pour récupérer un utilisateur et le connecter.

----

## Considérations sur les mots de passe

Django enregistre normalement les utilisateurs en chiffrant le mot de passe. Cela se fait en interne en utilisant la clé secrète du paramètre `SECRET_KEY`.

Si l'on manipule une instance du modèle utilisateur pour modifier son mot de passe et qu'on y assigne une valeur en clair, elle sera enregistrée en clair dans la base de données.

Pour chiffrer correctement le mot de passe, il faut utiliser `user.set_password()` qui utilise le chiffrage.

----

## Commandes pour l'authentification

- `changepassword <username>` : changer un mot de passe
- `createsuperuser` : créer un utilisateur qui a tous les droits (et accès à l'admin entre autres). Cet utilisateur possède `.is_superuser == True`
