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.
-
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. -
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. -
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. -
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. -
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.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?