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 鈥渁pesta鈥 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 鈥渢鈥 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 鈥楽TATELESS鈥, el SecurityContextHolder no tendr谩 en cuenta la autenticaci贸n almacenada (al hacer el getAuthentication siempre me retorna null).

Eliminando el 鈥楽TATELESS鈥 y al hacer la validaci贸n del 鈥榞etAuthentication == 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 鈥淜EY鈥 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?