Bienvenido a Platzi

Israel Camacho

Israel Camacho

student

Durante la introducción de este curso se hizo alusión a un caso de uso real y muy importante que -en mi entender- iba a ser resuelto durante el desarrollo del mismo.

Validar la identidad del usuario e identificar sus privilegios se llevó a cabo, lo que no se llevó a cabo fue abordar el caso de uso descrito: ¿Como diseñar e implementar la seguridad para que un usuario, sólo pueda ver sus movimientos y no así los movimientos de otros usuarios? Hay que tomar en cuenta que Roles "ADMIN" pudieran ver los movimientos de cualquier usuario o existan otros roles que agrupen movimientos de varios usuarios pero no todos...

Esto se podría ilustrar con las órdenes, permitiendo que el customer en cuestión pueda visualizar sus órdenes pero no las de otro customer, y también que un admin pueda visualizar todas.

Pregunta de examen: ¿Cómo implementarían ésto? Me gustaría ver sus approaches e ideas para ello, les comparto un approach básico para éste caso de uso, posteriormente les comparto el approach específico a este, tomen en cuenta lo siguiente que ya se ha visto en éste curso:

Autenticación de Usuarios: Implementa la autenticación de usuarios utilizando Spring Security. Puedes utilizar autenticación basada en tokens JWT (JSON Web Tokens) o sesiones, según tus necesidades.

  1. Autorización Basada en Roles: Define roles de usuario para diferentes niveles de acceso en tu sistema. Por ejemplo, podrías tener roles como "USER" y "ADMIN". Asegúrate de que cada usuario tenga asignado uno o más roles.

  2. Personalización de Usuarios: Extiende el objeto de usuario proporcionado por Spring Security para incluir información adicional, como el ID del usuario, su nombre, etc.

  3. Limitar el Acceso a Recursos: Implementa una capa de autorización personalizada utilizando anotaciones @PreAuthorize o @PostAuthorize en tus controladores. Esto permitirá definir condiciones específicas para acceder a ciertos recursos.

  4. Diseño de Endpoints: Diseña tus endpoints de manera que los recursos sensibles (como los movimientos de Israel) sean accesibles solo por usuarios con roles y permisos adecuados.

  5. Configuración de Seguridad: En la configuración de Spring Security, define reglas de autorización detalladas utilizando expresiones SpEL (Spring Expression Language) dentro de las anotaciones @PreAuthorize o @PostAuthorize.

@RestController @RequestMapping("/movimientos") public class MovimientosController { @GetMapping("/{usuario}") @PreAuthorize("#usuario == authentication.principal.username") // Solo el usuario autenticado puede acceder a sus propios movimientos public ResponseEntity<List<Movimiento>> getMovimientos(@PathVariable String usuario) { // Implementa la lógica para obtener los movimientos del usuario } @GetMapping("/{usuario}/{id}") @PreAuthorize("#usuario == authentication.principal.username") // Solo el usuario autenticado puede acceder a su propio movimiento public ResponseEntity<Movimiento> getMovimiento(@PathVariable String usuario, @PathVariable Long id) { // Implementa la lógica para obtener un movimiento específico del usuario } }

Traslademos lo anterior al caso de uso de orders para la pizzeria.

Saludos; Nunca pares de aprender.

2 respuestas
    Juan David Torres Camacho

    Juan David Torres Camacho

    student

    Voy a probar eso, muchas gracias! Estaba buscando justo esta información, voy a probarla y te aviso como me va. Héroe sin capa

    J. Sebastián Botello. H.

    J. Sebastián Botello. H.

    student

    Creo que tu mismo te respondiste.

    Eso no va en la seguridad (SPRING SECURITY) Eso va en la lógica de negocio.

    Puedes crear un endpoint con toda la seguridad de roles, authorities, etc pero tu. lógica de negocio o reglas están mal diseñadas pues podrías ver lo que tu llamas "movimientos de otros usuarios"

    En la vida real a excepción de los monolitos - Hay un servicio que ya se encarga de la lógica de autenticación y autorización... en lugar de que todo pasé en el mismo lugar como lo es en el ejemplo aquí.

    La autenticación básica es demasiado vulnerable, entonces se usan JWT en los headers y eso es suficiente para definir a que tiene acceso a nivel del back.

Curso de Java Spring Security: Autenticación y Seguridad Web

Curso de Java Spring Security: Autenticación y Seguridad Web

Protege aplicaciones web con Spring Security. Implementa autenticación y autorización personalizadas usando JSON Web Tokens. Aprende a configurar filtros de seguridad para garantizar un acceso seguro y auditar usuarios en tu sistema.

Curso de Java Spring Security: Autenticación y Seguridad Web
Curso de Java Spring Security: Autenticación y Seguridad Web

Curso de Java Spring Security: Autenticación y Seguridad Web

Protege aplicaciones web con Spring Security. Implementa autenticación y autorización personalizadas usando JSON Web Tokens. Aprende a configurar filtros de seguridad para garantizar un acceso seguro y auditar usuarios en tu sistema.