Seguridad es un tema delicado y a la vez par mi complejo 😦, deberia haber un curso completo explicando a detalle este tema
Antes de empezar
Pasos para aprender Java Spring
Instalación de ambiente de desarrollo: Windows
¿Java sigue siendo gratuito?
Instalación de ambiente de desarrollo: Linux Ubuntu
Instalación de ambiente de desarrollo: macOS
Introducción a Spring boot
¿Qué es y qué usaremos de Spring?
Conocer qué es una aplicación autocontenida
Crear nuestra aplicación con Spring Initializr
Hola mundo con Spring Boot
Configurar Spring Boot
Crear la estructura del proyecto
Spring Data
¿Qué es JPA?
Conocer qué es Spring Data
Conectar la base de datos a nuestra aplicación
Mapear las tablas como clases
Crear Entity cuando su clave primaria es compuesta
Mapear relaciones entre clases
Usar la interface CrudRepository
Query Methods
Construyendo nuestra API
Implementar la anotación @Repository
¿Qué es el patrón Data Mapper y qué resuelve?
Orientar nuestra API al dominio con MapStruct
Orientar nuestro repositorio a términos del dominio
Inyección de dependencias
Implementar la anotación @Service
Implementar la anotación @RestController
Exponer nuestra API
Mejorando nuestra API
Controlar las respuestas HTTP
Crear el dominio de compras
Mapear el dominio de compras
Crear el repositorio de compras
Probando nuestros servicios de compras
Documentar nuestra API con Swagger
Spring Security
Configurar la seguridad de nuestra API con Spring Security
Generar un JWT
Autenticación con JWT
Autorización con JWT
Despliegue de nuestra aplicación
Desplegar nuestra API desde la ventana de comandos
Desplegar nuestra base de datos con Heroku
Desplegar nuestra API con Heroku
Conclusiones y despedida del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 47
Preguntas 21
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 😃
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?
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.