Antes de empezar

1

Pasos para aprender Java Spring

2

Instalación de ambiente de desarrollo: Windows

3

¿Java sigue siendo gratuito?

4

Instalación de ambiente de desarrollo: Linux Ubuntu

5

Instalación de ambiente de desarrollo: macOS

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

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripción 🔥

Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

5D
3H
26M
33S
Curso de Java Spring

Curso de Java Spring

Alejandro Ramírez

Alejandro Ramírez

Autorización con JWT

37/41
Recursos

Aportes 47

Preguntas 21

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

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

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.

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.

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.

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<>());
    }>

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

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 😃

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

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 😉

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.

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?

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!

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.

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.

🔐🚪 En un mundo cada vez más digital, la seguridad y privacidad son de suma importancia. Al utilizar tecnologías como JWT, puedes garantizar la seguridad de tu aplicación y proteger la información de tus usuarios.

👨‍💻💻 Además, Spring Boot es una excelente herramienta para construir aplicaciones web robustas y escalables, y la combinación con JWT puede mejorar aún más la seguridad y la experiencia del usuario. ¡Sigue adelante con el curso y continúa aprendiendo más sobre estas herramientas increíbles!

Media clase me perdi jajajajaj, pero no se sigue hasta que se entienda. Seguridad, un campo que amo y que odio a la vez

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)
    }

Para los que les salio el siguiente error

io.jsonwebtoken.UnsupportedJwtException: Signed Claims JWSs are not supported

Yo lo solucione de la siguiente manera agregando el .setClaims(new HashMap<>())

public String generateToken(UserDetails userDetails){
return Jwts.builder()
.setClaims(new HashMap<>())
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + (10006060*10)))
.signWith(SignatureAlgorithm.HS256,KEY).compact();
}

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

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

Como WebSecurityConfigurerAdapter se encuentra obsoleto en la actualidad de este comentario, modifiqué la clase SecurityConfig y realicé la autorización como la hizo el profe pero haciendo uso de la interface SecurityFilterChain. El resultado de esto me funcionó de maravilla y todos los métodos funcionaron correctamente en postman. Aquí abajo les dejo el fragmento de código:

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests()
                .antMatchers("/**/authenticate").permitAll()
                .anyRequest()
                .authenticated().and().sessionManagement()      
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS); 

        http.addFilterBefore(jwtFilterRequest, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

No se olviden de inyectar el jwtFilterRequest jeje

Jwts.parser() esta deprecado

Lo pueden hacer de esta forma

Jwts.parserBuilder().setSigningKey(KEY).build().parseClaimsJws(token)

En todos los cursos de Java en Platzi, te explican al comienzo todo paso a paso, luego llega la parte final del proyecto y te tapan a código que casi parece magia jajajaj

Ojalá algún día programar en Java con tanta fluidez como lo hace el 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.

Ya tengo experiencia como desarrollador y me parece que la forma en que se explica la autorización con jwt fue muy compleja tambien falto aclarar dudas como lo son validaciones a nivel de campos y algunas excepciones que faltaron por controlar.

Que mezcles español e ingles en las entidades y capa de datos no me parecio practico ya que se hace muy confuso a la hora de implementar todo el proyecto en ingles.

Tampoco me quedo tan claro la estrutura del proyecto se me hace confusa de implementar en un proyecto grande

Excelente, por fin encontré un capitulo intermedio de java.

Ojalá puedan agregar spring data ldap

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.

Simplemente magistral, gracias profe

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

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?

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✌!

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?