You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Django proporciona un [sistema de autenticación](https://docs.djangoproject.com/en/stable/topics/auth/default/) —incorporado en el propio framework— que facilita en gran medida la gestión de accesos y de usuarios.
9
+
Django proporciona un [sistema de autenticación](https://docs.djangoproject.com/en/stable/topics/auth/default/) —incorporado en el propio framework— que facilita en gran medida la gestión de accesos y de usuarios.
10
10
11
11
## Usuario { #user }
12
12
@@ -20,6 +20,17 @@ Existe un modelo [`User`](https://docs.djangoproject.com/en/stable/ref/contrib/a
El **password** se almacena [«hasheado»](https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-management-in-django) en la base de datos. Django utiliza —por defecto— el algoritmo [PBKDF2](https://en.wikipedia.org/wiki/PBKDF2) con una función «hash» [SHA256](https://es.wikipedia.org/wiki/SHA-2), aunque se podría cambiar. El formato utilizado es: `<algorithm>$<iterations>$<salt>$<hash>`
26
+
27
+
Un <span class="example">ejemplo:material-flash:</span> de «password» en la base de datos sería:
Este modelo se encuentra en la clase `#!python django.contrib.auth.models.User`, pero es posible «suplantarla» con un modelo propio de usuario. Es por ello que ^^no se recomienda^^ acceder directamente a esta clase a través de un `import` sino utilizar otros «atajos» más genéricos.
@@ -28,25 +39,74 @@ Para **acceder al modelo de usuario** disponemos de dos vías:
28
39
29
40
| Para uso en... | Importación | Acceso | Descripción | Valor por defecto |
30
41
| --- | --- | --- | --- | --- |
31
-
| Claves ajenas |`#!python from django.conf import settings`|`settings.AUTH_USER_MODEL`| Cadena de texto cualificada |`#!python 'auth.User'`|
32
-
| Vistas y/o formularios |`#!python from django.contrib.auth import get_user_model`|`get_user_model()`| Función que devuelve el modelo |`django.contrib.auth.models.User`|
42
+
|[Claves ajenas](models.md#foreign-keys)|`#!python from django.conf import settings`|`settings.AUTH_USER_MODEL`| Cadena de texto cualificada |`#!python 'auth.User'`|
43
+
|[Vistas](views.md) y/o [formularios](forms.md)|`#!python from django.contrib.auth import get_user_model`|`get_user_model()`| Función que devuelve el modelo |`django.contrib.auth.models.User`|
33
44
34
45
### Acceso a la instancia { #user-instance }
35
46
36
47
Para **acceder a la instancia del usuario logeado** en Django disponemos de dos vías:
37
48
38
49
| Para uso en... | Acceso |
39
50
| --- | --- |
40
-
| Vistas |`request.user`|
41
-
| Plantillas |`#!htmldjango {{ user }}`|
51
+
|[Vistas](views.md)|`request.user`|
52
+
|[Plantillas](templates.md)|`#!htmldjango {{ user }}`|
42
53
43
-
## Login { #login }
54
+
Veamos un <spanclass="example">ejemplo:material-flash:</span> en el que accedemos a la instancia de un usuario:
55
+
56
+
```pycon
57
+
>>> from django.contrib.auth import get_user_model
58
+
>>> User = get_user_model()
59
+
60
+
>>> guido = User.objects.get(username='guido')
61
+
62
+
>>> guido
63
+
<User: guido>
64
+
>>> guido.first_name
65
+
'Guido'
66
+
>>> guido.last_name
67
+
'van Rossum'
68
+
```
69
+
70
+
!!! info "Usuario anónimo"
71
+
72
+
Cuando el usuario que interactúa con la web aún no está autenticado, Django lo identifica como [`AnonymousUser`](https://docs.djangoproject.com/en/stable/ref/contrib/auth/#anonymoususer-object).
44
73
45
-
Para implementar el procedimiento de **inicio de sesión** debemos llevar a cabo distintas tareas.
74
+
## Aplicación { #app }
46
75
47
-
??? tip "accounts"
76
+
Se recomienda [crear una aplicación](apps.md#creation)`accounts` (o similar) donde implementar todos los artefactos necesarios para la autenticación de usuarios.
48
77
49
-
Se recomienda crear una aplicación `accounts` donde implementar todos los artefactos necesarios de cara al inicio de sesión «login».
78
+
En las URLs de primer nivel deberíamos incluir algo así:
79
+
80
+
```python title="main/urls.py" hl_lines="7"
81
+
from django.contrib import admin
82
+
from django.urls import include, path
83
+
84
+
urlpatterns = [
85
+
path('admin/', admin.site.urls),
86
+
path('posts/', include('posts.urls')),
87
+
path('', include('accounts.urls')),
88
+
]
89
+
```
90
+
91
+
De tal forma que tendremos acceso «directo» a las funcionalidades de autenticación desde la raíz de la URL:
92
+
93
+
-`/login/`
94
+
-`/logout/`
95
+
-`/signup/`
96
+
97
+
!!! warning "Nombre"
98
+
99
+
No podemos llamar `auth` a esta aplicación porque entraría en conflicto con la aplicación [`django.contrib.auth`](https://docs.djangoproject.com/en/stable/ref/contrib/auth/#django-contrib-auth) de Django.
100
+
101
+
## Login { #login }
102
+
103
+
Para implementar el procedimiento de **inicio de sesión** debemos desarrollar varios elementos:
1. No podemos llamar `login` a nuestra vista ya que entraría en conflicto con la función [`login`](https://docs.djangoproject.com/en/stable/topics/auth/default/#django.contrib.auth.login) de Django.
107
-
2. Si el usuario ya está autenticado lo redirigimos a una URL predefinida.
108
-
3. El formulario debe estar validado para poder continuar.
109
-
4. La función [`authenticate`](https://docs.djangoproject.com/en/stable/topics/auth/default/#django.contrib.auth.authenticate) de Django verifica si las credenciales de usuario son correctas. En tal caso devuelve el usuario en cuestión. En otro caso devuelve `#!python None`.
110
-
5. La función [`login`](https://docs.djangoproject.com/en/stable/topics/auth/default/#django.contrib.auth.login) de Django se encarga de «logear» (iniciar sesión) al usuario.
111
-
6. Si todo ha ido bien redirigimos a la siguiente URL `next` (si es que existe) o a la URL por defecto `FALLBACK_REDIRECT`, en otro caso.
112
-
7.- Añadimos un error al formulario indicando que las credenciales son incorrectas.
165
+
2. Indica aquí un nombre de URL a la que redirigir (por defecto).
166
+
3. Si el usuario ya está autenticado lo redirigimos a una URL predefinida.
167
+
4. El formulario debe estar validado para poder continuar.
168
+
5. La función [`authenticate`](https://docs.djangoproject.com/en/stable/topics/auth/default/#django.contrib.auth.authenticate) de Django verifica si las credenciales de usuario son correctas. En tal caso devuelve el usuario en cuestión. En otro caso devuelve `#!python None`.
169
+
6. La función [`login`](https://docs.djangoproject.com/en/stable/topics/auth/default/#django.contrib.auth.login) de Django se encarga de «logear» (iniciar sesión) al usuario.
170
+
7. Si todo ha ido bien redirigimos a la siguiente URL `next` (si es que existe) o a la URL por defecto `FALLBACK_REDIRECT`, en otro caso.
171
+
8.- Añadimos un error al formulario indicando que las credenciales son incorrectas.
113
172
- El primer parámetro de la función `add_error()` es el campo al que queremos añadir el error, y el segundo parámetro es el mensaje de error en sí mismo.
114
173
- Como estos errores son «generales» a todo el formulario, indicamos `#!python None` en el campo.
115
174
116
175
### URL de login { #login-url }
117
176
118
-
Debemos añadir en las [URLs de primer nivel](urls.md#main-urls) la ruta (y la vista) para gestionar el inicio de sesión:
1.- Puede ser interesante crear una aplicación `accounts` para «empaquetar» toda la lógica de negocio que tiene que ver con autenticación.
132
-
- :fontawesome-solid-triangle-exclamation:{ .yellow } No podemos llamar `auth` a la aplicación porque entraría en conflicto con la aplicación [`django.contrib.auth`](https://docs.djangoproject.com/en/stable/ref/contrib/auth/#django-contrib-auth) de Django.
133
187
134
188
!!! info "LOGIN_URL"
135
189
@@ -157,52 +211,43 @@ En algún punto de nuestras plantillas deberemos añadir un enlace para iniciar
157
211
158
212
## Logout { #logout }
159
213
160
-
Para implementar el procedimiento de **cierre de sesión** debemos llevar a cabo distintas tareas.
161
-
162
-
??? tip "accounts"
163
-
164
-
Se recomienda crear una aplicación `accounts` donde implementar todos los artefactos necesarios de cara al cierre de sesión «logout».
165
-
166
-
### Formulario de logout { #logout-form }
167
-
168
-
No es necesario implementar un formulario para cierre de sesión.
214
+
Para implementar el procedimiento de **cierre de sesión** debemos desarrollar varios elementos:
169
215
170
-
### Plantilla de logout { #logout-template }
171
-
172
-
No es necesario implementar una plantilla para cierre de sesión.
216
+
-[ ] Formulario.
217
+
-[ ] Plantilla.
218
+
-[x] Vista.
219
+
-[x] URL.
220
+
-[x] Enlace.
173
221
174
222
### Vista de logout { #logout-view }
175
223
176
224
```python title="accounts/views.py"
177
225
from django.contrib.auth import logout
178
226
from django.shortcuts import redirect
227
+
from django.urls import reverse
179
228
180
229
181
230
defuser_logout(request):
231
+
FALLBACK_REDIRECT='index'
232
+
182
233
logout(request)#(1)!
183
-
return redirect('home')
234
+
return redirect(reverse(FALLBACK_REDIRECT))
184
235
```
185
236
{ .annotate }
186
237
187
238
1. La función [`logout`](https://docs.djangoproject.com/en/stable/topics/auth/default/#django.contrib.auth.logout) de Django se encarga de cerrar la sesión del usuario actualmente «logeado».
188
239
189
240
### URL de logout { #logout-url }
190
241
191
-
Debemos añadir en las [URLs de primer nivel](urls.md#main-urls) la ruta (y la vista) para gestionar el cierre de sesión:
1.- Puede ser interesante crear una aplicación `accounts` para «empaquetar» toda la lógica de negocio que tiene que ver con autenticación.
205
-
- :fontawesome-solid-triangle-exclamation:{ .yellow } No podemos llamar `auth` a la aplicación porque entraría en conflicto con la aplicación [`django.contrib.auth`](https://docs.djangoproject.com/en/stable/ref/contrib/auth/#django-contrib-auth) de Django.
206
251
207
252
### Enlace de logout { #logout-link }
208
253
@@ -217,11 +262,13 @@ En algún punto de nuestras plantillas deberemos añadir un enlace para cerrar s
217
262
218
263
## Registro { #signup }
219
264
220
-
Para implementar el procedimiento de **registro de usuario** debemos llevar a cabo distintas tareas.
265
+
Para implementar el procedimiento de **registro de usuario** debemos desarrollar varios elementos:
221
266
222
-
??? tip "accounts"
223
-
224
-
Se recomienda crear una aplicación `accounts` donde implementar todos los artefactos necesarios de cara al registro «signup».
267
+
-[x] Formulario.
268
+
-[x] Plantilla.
269
+
-[x] Vista.
270
+
-[x] URL.
271
+
-[x] Enlace.
225
272
226
273
### Formulario de registro { #signup-form }
227
274
@@ -288,7 +335,7 @@ class SignupForm(forms.ModelForm):
1.- Puede ser interesante crear una aplicación `accounts` para «empaquetar» toda la lógica de negocio que tiene que ver con autenticación.
338
-
- :fontawesome-solid-triangle-exclamation:{ .yellow } No podemos llamar `auth` a la aplicación porque entraría en conflicto con la aplicación [`django.contrib.auth`](https://docs.djangoproject.com/en/stable/ref/contrib/auth/#django-contrib-auth) de Django.
0 commit comments