Cómo usar el sistema de autenticación de Django - Parte 1: iniciar sesión y cerrar sesión.

in #utopian-io7 years ago (edited)

Intro: English
Title: How to use the Django authentication system - Part 1: log in and log out.
Language: Spanish / Español

Django comes with an users authentication system that allows to implement in a simple way the basic functionalities of login, password recovery, password update and logout. In this tutorial I will explain how to implement two of these functionalities using this useful module. We will use the django_base repository, that has the basic code to start a new Django project using docker, and whose building process is explained in this link. In this tutorial I'll include the login and logout functionalities usage. In a next post, I'll include the password recovery and password update.



Django cuenta con un sistema de autenticación de usuarios predetermiando que permite implementar de forma sencilla las funcionalidades básicas de inicio de sesión, recuperación y actualización de contraseñas y cierre de sesión. En este turorial explicaré como implementar dos de estas funcionalidades utilizando este útil módulo. Utilizarémos el repositorio django_base, el cuál tiene el código básico necesario para iniciar un nuevo proyecto utilizando docker, y cuya construcción está explicada en este link. En este tutorial incluiré la implementación de las funcionalidades de iniciar sesión y cerrar sesión. En una próxima publicación, implementarémos las funcionalidades de recuperar contrseña y actualizar contraseña.



django_base es un repositorio que incluye las configuraciones básicas necesarias para iniciar un nuevo proyecto Django. Usarémos este repositorio para implementar el sistema de autenticación de Django, por lo que lo primero que debemos hacer es clonarlo desde una terminal:

$ git clone https://github.com/roadhousestudio/django_base.git

Despues de clonarlo, en la terminal, nos movemos a la raiz del proyecto:

$ cd django_base/

Construimos y levantamos el contenedor Docker con los siguietes comandos (Recordar que Docker debe estar instalado y corriendo):

$ docker-compose build
$ docker-compose up

Y listo, tenemos nuestro proyecto Django listo para empezar a implementar el sistema de autenticación.

1. Instalación

Cuando iniciamos un nuevo proyecto Django, el sistema de autenticación viene instalado por defecto. Igual, vamos a confirmar cuales son las configuraciones que deben estar establecidas en el archivo settings.py para utilizar este módulo.

Primero, en los INSTALLED_APPS debemos agregar los items django.contrib.auth y django.contrib.contenttypes:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth', # Incluir los modelos predeterminados de usuarios y el sistema de autenticación.
    'django.contrib.contenttypes', # Incluir sistem predetermiando de permisos.
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
] 

En los MIDDLEWARE, debemos agregar los items SessionMiddleware y AuthenticationMiddleware:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware', # Gestiona las sesiones de usuarios en cada solicitud.
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware', # Permite asociar usuarios y solicitudes usando sesiones.
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Una vez confirmemos esta configuración, corremos migraciones para crear la base de datos. Podemos correr migraciones de dos formar; por medio del comando:

$ docker exec -it djangobase_web_1 python manage.py migrate

O deteniendo el contenedor con ctrl + c y levantandolo de nuevo con el comando:

$ docker-compose up

Cada vez que se corra este comando, se correrán las migraciones pendientes, debido a que está especificado en el archivo docker-compose.yml.

2. Modelo de usuario

El módulo django.contrib.auth que agregamos previamente a los INSTALLED_APPS de nuestra aplicación en el archivo app/settings.py habilita el modelo de usuario predeterminado de Django, el cual podemos importar de la siguiente forma:

from django.contrib.auth.models import User

Este modelo cuenta los campos básicos para representar un Usuario en una plataforma web como username, first_name, last_name, email, password, entre otros. Utilizarémos este modelo para crear nuestro sistema de usuarios.

3. Formulario de inicio de sesión.

En la carpeta app/templates/ Creamos la carpeta auth/, en la cual gurdarémos las plantillas de nuestro sistema de autenticación de usuarios. dentro de esta carpeta creamos la plantilla login.html. Después, definimos una url en el archivo app/urls.py en la definimos la vista de iniciar sesión que trae predeterminado el sistema de autenticación de Django. Editamos el archivo app/urls.py de la siguiente forma:

app/urls.py


appurls.png


Código fuente

Como vemos, definimos la nueva vista auth_login, en la que utilizamos la vista predeterminada de Django que importamos del módulo django.contrib.auth, le indicamos que use la plantilla auth/login.html y que cuando un usuario utenticado llegué a esta url, sea redirigido a una vista que definirémos en nuestro archivo app/settings.py un poco más adelante. Si navegamos a la url localhost:8000/login.html solo visualizarémos una pantalla vacía, esto es por que no hemos agregado contenidos a la plantilla app/templates/auth/login.html. Lo editamos de la siguiente forma:

app/templates/auth/login.html


Screen Shot 2017-12-07 at 2.15.44 PM.png

Código fuente

Archivo que extendémos del archivo app/templates/layout/base.html, y en el que gracias a que estámos utilizando la vista de login incluida en Django, podemos obtener un formulario de autenticación con los campos username y password.


Screen Shot 2017-12-07 at 2.24.01 PM.png

También estamos usando las clases predeterminadas de Bootstrap 4, por lo que podemos ver nuestro formulario con algo de estilos básico. Ahora vamos al archivo settings.py y agregamos la siguiente configuración, en la que definimos la url de autenticación para que cuando por ejemplo, un usuario intente acceder a una url para la que es requerido estar autenticado, sea redirigido a ella, y también definimos la url a la que serán redirigidos los usuarios una vez el hayan diligenciado el formulario de autenticación correctamente:

LOGIN_URL = 'user:auth_login'
LOGIN_REDIRECT_URL = 'dashboard'

Procedemos entonces a creaer la url dashboard y la respectiva vista. En el archivo url definimos la siguiente url en el archivo app/urls.py:

from app.views import DashboardView
url(
    r'^dashboard/$',
    DashboardView.as_view(),
    name='dashboard',
), 


Código fuente

Tener en cuenta que debemos importar la clase DashboardView en app/urls.py, y crearla en el archivo de vistas app/views.py. Esta vista la difinimos de la siguiente forma:

app/views.py


Screen Shot 2017-12-07 at 2.39.17 PM.png

Código fuente

Después procedemos a crear la plantilla app/templates/dashboard.html. Dentro de esta plantilla solo vamos a poner el siguiente contenido:

app/templates/dashboard.html


Screen Shot 2017-12-07 at 2.58.43 PM.png

Código fuente

Como vemos, en el sistema de plantillas de Django, si el usuario está autenticado podemos obtener su instancia en la variable predetermianda user de la forma {{ user }}, por lo que cuando un usuario se autentica exitosamente, lo que le mostrarémos es el dashboard en blanco con el username.

Para probar, creamos un usuario superusuario con el siguiente comando:

$ docker exec -it djangobase_web_1 python manage.py createsuperuser

Se nos preguntará por un nombre de usuario, un correo, una contraseña, y posteriormente nos dirigimos a nuestro formulario de autenticación y deligenciamos el formulario con el nombre de usuario y contraseña que acabamos de crear. Si el proceso de autenticación fue correcto, se debe mostrar al usuario un pantallazo como el siguiente, que representa nuestro dashboard vacío con el username del usuario autenticado en la esquina superior izquierda.


Screen Shot 2017-12-07 at 3.13.06 PM.png

4. Cerrar sesión


Una vez implementado exitosamente el proceso de autenticación de usuario, procedemos a implementar la funcionalidad de cerrar sesión. Esta es mucho más sencilla, debido a que no debemos definir una plantilla, sino que basta con indicar a que url queremos que sean redirigdos los usuario cuando cierren sesión.

Definimos la url logout en el archivo app/urls.py de la siguiente manera:

app/urls.py


Screen Shot 2017-12-07 at 3.35.01 PM.png



Código fuente

Eliminamos la variable {{ user }} del archivo app/templates/dashboard.html y agregamos una barra de navegación con estilos predeterminados de Bootstrap en el archivo app/templates/layout/base.html, de la siguiente manera:

app/templates/layout/base.html


Screen Shot 2017-12-07 at 3.32.44 PM.png


Código fuente

Ahora, al recargar la url localhost:8000/dashboard/ debemos ver la barra de navegación con username del usuario autenticado y el link Cerrar sesión.


Screen Shot 2017-12-07 at 3.39.06 PM.png


En el archivo app/settings.py, agregamos la siguiente configuración:

LOGOUT_URL = 'logout'
LOGOUT_REDIRECT_URL = 'home'

En donde especificamos que logout es la url para cerrar sesión, y que cuando un usuario cierre sesión, será redirigido a la url home (localhost:8000). Como en el archivo app/templates/layout/base.html definimos que el atributo href del link de cerrar sesión era la url logout, al hacer click sobre este link, la sesión de usuario será cerrada y el usuario será redirigido a la siguiente vista:


Screen Shot 2017-12-07 at 4.06.55 PM.png





Y así hemos implementado las dos primeras funcionalidades básicas del sistema de autenticación de Django, y habilitamos a los usuarios de nuestra aplicación para que puedan auntenticarse en la plataforma y cerrar sesión. En un próximo tutorial, veremos como implemetar las funcionalidades para recueprar contraseña y actualizar contraseña.


Feliz fin de semana para todos.

Segunda parte - Recuperación y actualización de contraseña.




Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Hola Andres, Gusto de saludarte! soy nueva en Steemit y estoy haciendo nuevos amigos y veo que ya tu tienes experiencia, me gustaría que vieras mi ultimo post en mi perfil, tiene un enlace para unirse a un grupo de Whatsapp donde puedes compartir tus publicaciones mis amig@s y yo te vamos a votar, asi puedes mejorar tus resultados con votos orgánicos y puedes conocer mas personas, por cierto muy buen post! es informacion MUY util y muy escasa, gracias por compartir. UpVote
te estoy siguiendo

Gracias @erikatrend. Revisaré tu perfil y desde ya, te deseo muchos éxitos en la plataforma.

Hey @kit.andres I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • You are generating more rewards than average for this category. Super!;)
  • Seems like you contribute quite often. AMAZING!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x

Congratulations @kit.andres! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of posts published

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

Muy buen post, tiene un contenido muy completo

Muchas gracias. Veo que en su introduceyouself habla de sistemas de georreferenciación. Le seguiré porque es un tema que me interesa bastante.

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Coin Marketplace

STEEM 0.16
TRX 0.16
JST 0.029
BTC 68503.89
ETH 2535.33
USDT 1.00
SBD 2.52