Cuarto reto de Alura + Oracle Next Education grupo 5.
Este reto cosiste en aplicar los conocimientos adquiridos en el programa ONE sobre Spring Boot 3 - JAVA API Rest y Spring Security - JWT . Este proyecto se enfoco a nivel de back end para replicar los procesos de la administracion de topicos de un foro, utilizando la arquitectura de software conocido como REST. Mediante del uso de HTTP Request la API respondera a las diferentes acciones de CRUD (CREATE, READ, UPDATE, DELETE), finalmente la API aplica conceptos de Spring Security mediante el uso de token JWT (JOSON WEB TOKEN).
El reto cosiste en crear una API Rest con Spring Boot 3, que repique a nivel de back end parte de los procesos de un Foro. Este reto se divide en dos partes, la primera es sobre la aplicación del CRUD en la creación de Tópicos, y la segunda sobre autenticación y seguridad.Esta parte consiste en que la API debe de permitir a los usuarios realizar las siguientes acciones:
-
Crear un nuevo tópico
-
Mostrar todos los tópicos creados
-
Mostrar un tópico específico
-
Actualizar un tópico
-
Eliminar un tópico
/topicos
de un JSON con el titulo, mensaje, autor y curso en el body.
-
Todos los campos del JSON son obligatorios.
-
La API no debe permitirlos registros duplicados (que contengan el mismo el mismo título y mensaje).
/topicos
, cuyo retornó será una lista de JSON con titulo, mensaje, fecha de creación, estado, autor y curso en el body.
/topicos
de un JSON con el id, titulo, mensaje, autor y curso en el body.
-
El campo de id y autor son obligatorios.
-
El autor no se debe acturalizar.
-
Solo el autor del topico puede actualizar el titulo, mensaje y curso.
-
Los campos que llegen nullos o en blanco no se debe de actualizar.
-
La API no debe permitirlos registros duplicados (que contengan el mismo el mismo título y mensaje).
/topicos/{id}
, cuyo retornó será un JSON con titulo, mensaje, fecha de creación, estado, autor y curso en el body.
/topicos/{id}
, cuya accion elimnará el topico del la base de datos.
Esta parte consiste en la seguridad de la API con Spring Boot Segurity, también incluye la documentación de la misma con Swagger, para esta parte la API de de cumplir con los siguientes requisitos:
-
Debe de existir un endpoint publico para la autenticación de los Usuarios, con un JSON con el nombre del usuario y su contraseña.
-
Después de la autenticación, si esta es exitosa (OK 200), la solicitud debe retornar con un JWT.
-
Para acceder a las operaciones de los controladores se debe autenticar por medio del un JWT en le Header del la solicitud HTTP.
-
La API debe implementar una interfaz facil amigable y accesible, con la cual el usuario mediante un explorador Web podra tener acceso a las operaciones de la API (SpringFox Swagger).
-
Agregar una descripción a las operaciones de los controladores.
-
Configurar los accesos para que la interfaz de Swagger sea accesible.
-
Configurar Swagger para con esta interfaz el usuario pueda autenticarse.
- Eclipse 2023-06 (4.28.0).
- MySQL 8.0.34.
- Spring Boot 3.0.6.
- Maven 4.0.0.
- Lombok 1.18.30 (eclipse plugin).
- JDK 17.
- JAVA-JWT Auth0 4.2.0.
- Spring Doc Open API -Swagger 2.1.0.
- Spring Web.
- Spring Boot DevTools.
- Lombok.
- Spring Data JPA.
- Flyway Migration.
- MySQL Driver.
- Validation.
- Spring Security
- auth0 java-jwt
- Springdoc Openapi
Despues de descargar y descomprimir en su PC el proyecto de este repositorio, importelo a su IDE, despues actualice el
pom.xml
, para que se descargen todas las dependencias del proyecto.
Nota
La version de Sring framework boot puede cambiar, por lo que si tienen problemas con la actualizacion del
pom.xml
, visite Spring Boot Initializer y cambie la version por la mas cercana a la utilizada en este proyecto.
Después de instalar las dependencias y preparar el entorno del IDE, instsle MySQL workbench 8, y cree la base de datos con el siguienete SQL:
CREATE DATABASE foro_alura;
Luego diríjase a las propiedades de la aplicación en archivo application.properties
en \src\main\resources
, en este achivo configure las propiedades de conexión a la base de datos URL, Usuario y contraseña.
spring.datasource.url=jdbc:mysql://localhost:3306/foro_alura
spring.datasource.username= usuario
spring.datasource.password= contraseña
Por defecto la API, si no exite la tabla Usuarios, esta se creara con el usuario Admin con contraseña 1234. Si desea modificar este usuario, antes de ejecutar por primera vez la API, debe modificar el SQL V1 en \src\main\resources\db\migration
. recuede que la contraseña debe de estar encriptada, para esto puede utilizar este el Bcrypt Generator.
El usuario configurado lo puede cambiar modificando los valores del siguiente del SQL V1:
INSERT INTO Usuarios (nombre, email, contrasena)
VALUES ('Admin', 'admin@g.com', '$2a$10$aga6Mf8jeIvEW/EWuC969e8NnQhVFP1wm8k.pnRf/x/1uBmkDC3vG');
Nota
Al ejecutar por primera vez Flyway automaticamente realizara la migracion a la base que usted haya configurado en las propiedades de la aplicacion. Si ya ejecuto el servidor y no modifico el usuario por defecto, debe ir al la base de datos y realizar alli las actualizaciones, o bien deteniendo el servidor, y agregando un SQL al la migracion.
Finalmente dirijase a la clase principal ForoInicialApplication
en el paquete com.alura.foro
, ejecutela para iniciar el servidor.
Para utilizar esta API pueden utilizar Postman o Insomnia, que son herramientas para probar HTTP request:
Tambien puede probar esta API con su explorador WEB, ya que este proyecto incluye la interfaz grafica de Springdoc Openapi. 1. Autenticación y generación de JWT
En su explorador acceda al URI de Swagger en la direccion de su servidor, en este caso es http://localhost:8080/swagger-ui/index.html#/
, después acceda a la opcion de Autenticacion y realice la solicitud Htpp:
Despues de ejecutar la solicitud, la API le retornara el JWT si el usuario es valido y esta en la Base de datos:
- Registrando primer curso
Dirijase a la opcion curso-controller en la operacion POST/cursos, y ejecute la siguiente request body:
{
"nombre": "Spring Boot 3",
"categoria": "Programacion"
}
Si la consulta es exitosa le retornara el JSON con el curso creado:
{
"id": 1,
"nombre": "Spring Boot 3",
"categoria": "Programacion"
}
- Registrando primer topico
Nota Para poder realizar esta operacion, debe de tener registrado al menos un curso.
Dirijase a la opcion topicos-controller en la operacion POST/topicos, y ejecute la siguiente request body:
{
"titulo":"Pagina blanca Error",
"mensaje":"Al crear controller Hola",
"id_autor":"1",
"id_curso":"1"
}
Si la consulta es exitosa le retornara el JSON con el topico creado:
{
"id": 1,
"titulo": "Pagina blanca Error",
"mensaje": "Al crear controller Hola",
"fechaCreacion": "2023-09-28T19:57:51.0443519",
"estado": "NO_RESPONDIDO",
"id_autor": 1,
"autor": "Admin",
"id_curso": 1,
"curso": "Spring Boot 3"
}
- Mostrar todos los topicos.
Dirijase a la opcion topicos-controller en la operacion GET/topicos, y ejecute el HTTP.después del envio se retornará una lista de JSON como la siguiente:
[
{
"id": 1,
"titulo": "Pagina blanca Error",
"mensaje": "Al crear controller Hola",
"fechaCreacion": "2023-09-28T00:00:00",
"estado": "NO_RESPONDIDO",
"id_autor": 1,
"autor": "Admin",
"id_curso": 1,
"curso": "Spring Boot 3"
},
{
"id": 2,
"titulo": "Problema de servidor",
"mensaje": "Al iniciar el servidor falla la migracion",
"fechaCreacion": "2023-09-28T00:00:00",
"estado": "NO_RESPONDIDO",
"id_autor": 1,
"autor": "Admin",
"id_curso": 1,
"curso": "Spring Boot 3"
}
]
2023