Antes de empezar

1

Pasos para aprender Java Spring

2

¿Java sigue siendo gratuito?

3

Instalación de ambiente de desarrollo: Linux Ubuntu

4

Instalación de ambiente de desarrollo: macOS

5

Instalación de ambiente de desarrollo: Windows

Introducción a Spring boot

6

¿Qué es y qué usaremos de Spring?

7

Conocer qué es una aplicación autocontenida

8

Crear nuestra aplicación con Spring Initializr

9

Hola mundo con Spring Boot

10

Configurar Spring Boot

11

Crear la estructura del proyecto

Spring Data

12

¿Qué es JPA?

13

Conocer qué es Spring Data

14

Conectar la base de datos a nuestra aplicación

15

Mapear las tablas como clases

16

Crear Entity cuando su clave primaria es compuesta

17

Mapear relaciones entre clases

18

Usar la interface CrudRepository

19

Query Methods

Construyendo nuestra API

20

Implementar la anotación @Repository

21

¿Qué es el patrón Data Mapper y qué resuelve?

22

Orientar nuestra API al dominio con MapStruct

23

Orientar nuestro repositorio a términos del dominio

24

Inyección de dependencias

25

Implementar la anotación @Service

26

Implementar la anotación @RestController

27

Exponer nuestra API

Mejorando nuestra API

28

Controlar las respuestas HTTP

29

Crear el dominio de compras

30

Mapear el dominio de compras

31

Crear el repositorio de compras

32

Probando nuestros servicios de compras

33

Documentar nuestra API con Swagger

Spring Security

34

Configurar la seguridad de nuestra API con Spring Security

35

Generar un JWT

36

Autenticación con JWT

37

Autorización con JWT

Despliegue de nuestra aplicación

38

Desplegar nuestra API desde la ventana de comandos

39

Desplegar nuestra base de datos con Heroku

40

Desplegar nuestra API con Heroku

41

Conclusiones y despedida del curso

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Java Spring

Curso de Java Spring

Alejandro Ramírez

Alejandro Ramírez

Autorización con JWT

37/41
Recursos

Aportes 39

Preguntas 15

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Seguridad es un tema delicado y a la vez par mi complejo 😦, deberia haber un curso completo explicando a detalle este tema

Creo que de todos los cursos y clases que he tomado en Platzi, esta sesion en particular es la que mas me ha costado 😒, en verdad creo que este video se hubiera podido repartir en varios y explicar a mas detalle algunas líneas de código que no se entiende bien que hacen o de donde salen 😦 muy compleja esta parte la verdad :S

Que manera de copiar sin entender nada

Buenas Tardes Alejandro,

Me podrías indicar como se puede agregar esta sección en el Swagger.

Que archivos debo modificar, seria una buena practica implementarlo.

Urgente un curso detallado de Spring Security porque vaya que es pesado.

código para la autenticación de usuarios en BD

<    @Autowired
    private AccesoRepo accesoRepo;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Access access = accesoRepo.auth(username);
        return new User(access.getUser(), ("{noop}" + access.getPass()), new ArrayList<>());
    }>

No sé si Spring hace complejo la seguridad o es que el API de seguridad de Java es la que “apesta” pero que módulo para mas pesado.

Pueden crear la Authorization bearer de manera mas sencilla mediante la pestaña Authorization en el Postman. Solo deben colocar el token y postman genera el header de manera automatica

Para practicar mas sobre JWT hay una funcionalidad en la página oficial de JWT (https://jwt.io/) para pasarle un token con esta codificación y ver su contenido 😉

El curso es muy bueno, la parte de la seguridad se avanza muy rápido y sin mucho detalle de lo que se realiza, lo que genera un poco de confusión.

Hay algun ejemplo de esto mismo pero con una base de datos?

Hola, ¿podrías explicar como hacer uso de esto con un usuario en base de datos? ya que así como se explico no tienen ningún uso profesional.
También creo que se debería explicar más detalladamente Spring security, ya que lo que se vio es demasiado básico.

Alejandro una consulta a modo empresarial , se usa el jwt token ?, he visto apps, que generan un token (digamos manual usando base64) despues de que el logueo (consultando user y password en la BD ) sea satisfactorio, y este es puesto en la session con un tiempo de expiracion , podria por favor comentar o mencionar lecturas al respecto, gracias!

Alejandro es un crack, explicar spring security no cualquier lo hace

Platzi tiene que mejorar mucho en separar cosas, ósea como van a meter todo este tema en cuatro clases.

Se que más de uno acá en su cabeza dijo que $#&%!! rea jajajaja.

Este módulo es demasiado pesado, no entendí muchas de las cosas que se explicaron, pero creo que es más por como funciona Spring Security, así que continuamos con toda.

La verdad estas ultimas clases y sobre todo esta solo he copiado código, no he podido entender muy bien, ha sido muy complejo para mi, mucho.
Pero soy consiente de que habrá temas que uno comprende mejor y temas que necesitas mas practica.
Espero entender todo esto mejor pronto.

Luego de realizar los ajustes de esta clase, no me devuelve el codigo JWT en postman, pero me responde un 200 y la aplicacion no muestra

Hola Alejandro, hasta aquí todo excelente, pero me ayudaría una barbaridad si nos das una leve introducción al cors de spring con gradle, ya que en la petición pública no tengo problemas pero con la del JWT no me funciona aun por el CORS, desde el postman funciona bien. Saludos

Hola a todos
por si alguno le pasa el siguiente error
io.jsonwebtoken.UnsupportedJwtException: Signed Claims JWSs are not supported.

Es causa del método getClaims, en mi caso tenia el siguiente código

private Claims getClaims(String token){
return Jwts.parser().setSigningKey(KEY).parseClaimsJwt(token).getBody();
}

Y el código correcto era este:

private Claims getClaims(String token){
    return Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();

}

Si lo notan la diferencia esta en el .parseClaimsJws y yo lo tenia con una “t” al final… esto no me daba problemas con el authenticate claramente pero si con los métodos que necesitan el token.
Espero les sirva 😃

Ojalá puedan agregar spring data ldap

El metodo doFilterInternal en kotlin:

override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
        val authorizationHeader:String? = request.getHeader("Authorization")
        authorizationHeader?.let {aut ->
            aut.startsWith("Bearer").let {
                val jwt: String = aut.substring(7)
                val username: String = jwtUtil.extractUsername(jwt)
                SecurityContextHolder.getContext().authentication ?: run {
                    val userDetails: UserDetails = gymUserDetailsService.loadUserByUsername(username)
                    jwtUtil.validateToken(jwt, userDetails).let {
                        val authToken: UsernamePasswordAuthenticationToken = UsernamePasswordAuthenticationToken(userDetails, null, userDetails.authorities)
                        authToken.details = WebAuthenticationDetailsSource().buildDetails(request)
                        SecurityContextHolder.getContext().authentication = authToken
                    }

                }
            }
        }

        filterChain.doFilter(request,response)
    }

El curso en general me ha parecido interesante y práctico. Me gustaría poder ver cómo sería el desarrollo en Java Spring de una aplicación web.

Que me perdone James Gosling, pero prefiero el middleware de .Net core, mientras tanto profesor que referencias podría obtener referente al tema de de spring security con JWT.

La verdad considero que si debería tener un curso completo enfocado a JWT debido a que se usan métodos propios de JWT y que por más que se explique que hace la verdad tiende ha ser varias funcionalidades que siendo sincero no creo poder implementar sin ayuda, pero todo esta funcionando OK, gracias profe Alejo por compartir su conocimiento.

Simplemente magistral, gracias profe

Hola, me estoy encontrando con este error a la hora de ejecutar la aplicación:

<Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]>

Hasta ahora, el JWT funcionaba a la perfección antes de esta clase. Es escuchado que el problema puede ser de las versiones de las dependencias, pero lo revise y no era. Alguien que tenga el conocimiento? Se los agradezco.

muy bien solo que pudieron a ver profundizado un poco más en esta parte y explicarlo mejor ya que no me queda claro todas las instrucciones, es lo que no me gusto de este curso

El filtro que creamos en esta clase me recuerda mucho a los middleware de express

seria bueno que al final de este video, se haga un repaso por el orden de la ejecución de los métodos, saludos.!!!

Haciendo debug para entender un poco mejor la parte de seguridad, creo que al colocar el ‘STATELESS’, el SecurityContextHolder no tendrá en cuenta la autenticación almacenada (al hacer el getAuthentication siempre me retorna null).

Eliminando el ‘STATELESS’ y al hacer la validación del ‘getAuthentication == null’ antes de la validación del token creo que no se podrá saber si la fecha de esté ya expiró.

Estoy equivocado ?

En mi trabajo me pidieron que hiciera un servicio de autenticación oauth2 pero que use el grand_type de authorization_code sin usar jwt, no se si alguien podría orientarme en ese especto

Pensé que esto de JWT lo hacía más sencilla la configuración… Aprecio la paciencia del docente para explicar cada cosa.

Creo que lo denso de la implementación de Spring-Security en nuestro proyecto es lo que lo hace mucho más seguro😋, a mi parecer hubiera quedado bien realizar el tema de seguridad en un proyecto aparte, xq si no mas así con solo lo referente al dominio del negocio ya se complico un poco con la conversion de entidades a objetos de domminio, osea… jejej. Sin embargo recomiendo se hubiera realizado algún grafico para explicar de una forma mas general este tema de la seguridad, xq si se he realizado cada uno de los pasos pero no he logrado digerir este tema. Muchas gracias profe @Alejandro, me anotaré al proximo curso de Spring-Security✌!

hice todo al pie de la letra pero, no arroja nada, ni si quiera me arroja la pagina de login, sino se queda en blanco, y el postman tampoco responde, que podría ser?

Solo como dato, la llave secreta “KEY” debe ser mas de 3 caracteres 😦

Como comentario, siento que estaría mejor usar HandlerInterceptorAdapter dentro de una clase WebMvcConfigurer en vez de un OncePerRequestFilter, ya que los otros interceptors te permiten incluso tener un control de cosas que puedes hacer después de responder, y poder dar cierta prioridad a que se ejecuten ciertos filtros antes que otros.

En el SecurityConfig en el metodo configure linter me pone una advertencia de seguridad que dice que no use el PasswordEncoder con un texto plano, cómo podría averiguar mas de como solucionar eso?