diff --git a/src/main/java/com/api/produc/sup/controllers/ProductoController.java b/src/main/java/com/api/produc/sup/controllers/ProductoController.java index 64ceb29..1b66f9e 100644 --- a/src/main/java/com/api/produc/sup/controllers/ProductoController.java +++ b/src/main/java/com/api/produc/sup/controllers/ProductoController.java @@ -51,6 +51,7 @@ public class ProductoController { @ApiResponse(responseCode = "404", description = "La Inserción del Producto no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @PostMapping("/") + @PreAuthorize("hasRole('ROLE_ADMIN')") public ResponseEntity addProducto(@RequestBody Producto producto) { try { @@ -76,6 +77,7 @@ public ResponseEntity addProducto(@RequestBody Producto producto) { @ApiResponse(responseCode = "404", description = "La Actualización del Producto no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @PutMapping("/") + @PreAuthorize("hasRole('ROLE_ADMIN')") public ResponseEntity updateProducto(@RequestBody Producto producto) { try { @@ -115,7 +117,7 @@ public ResponseEntity deleteProducto(@RequestBody UUID id) { } // ================= - // ===== GETALL ==== + // ===== GET ALL ==== // ================= @Operation(summary = "Listado Paginado de Productos") @ApiResponses(value = { @@ -125,7 +127,7 @@ public ResponseEntity deleteProducto(@RequestBody UUID id) { @ApiResponse(responseCode = "404", description = "El Listado de Productos no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/listado") - //@PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getAllProducto(Pageable pageable) { return productoService.findAllProducto(pageable); @@ -148,7 +150,7 @@ public Page getAllProducto(Pageable pageable) { @ApiResponse(responseCode = "404", description = "El Producto según su ID no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/id/{id}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Producto getById(@PathVariable("id") long id) { return productoService.findById(id); } @@ -165,7 +167,7 @@ public Producto getById(@PathVariable("id") long id) { @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su CODIGO no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/codigo/{codigo}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByCodigo(@PathVariable("codigo") String codigo, Pageable pageable) { return productoService.findByCodigo(codigo, pageable); } @@ -182,7 +184,7 @@ public Page getByCodigo(@PathVariable("codigo") String codigo, Pageabl @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su IMAGEN no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/imagen/{imagen}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByImagen(@PathVariable("imagen") String imagen, Pageable pageable) { return productoService.findByImagen(imagen, pageable); } @@ -199,7 +201,7 @@ public Page getByImagen(@PathVariable("imagen") String imagen, Pageabl @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su NOMBRE no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/nombre/{nombre}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByNombre(@PathVariable("nombre") String nombre, Pageable pageable) { return productoService.findByNombre(nombre, pageable); @@ -217,7 +219,7 @@ public Page getByNombre(@PathVariable("nombre") String nombre, Pageabl @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su MARCA no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/marca/{marca}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByMarca(@PathVariable("marca") String marca, Pageable pageable) { return productoService.findByMarca(marca, pageable); } @@ -234,7 +236,7 @@ public Page getByMarca(@PathVariable("marca") String marca, Pageable p @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su TIPO no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/tipo/{tipo}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByTipo(@PathVariable("tipo") String tipo, Pageable pageable) { return productoService.findByTipo(tipo, pageable); } @@ -251,7 +253,7 @@ public Page getByTipo(@PathVariable("tipo") String tipo, Pageable page @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su GRUPO no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/grupo/{grupo}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByGrupo(@PathVariable("grupo") String grupo, Pageable pageable) { return productoService.findByGrupo(grupo, pageable); } @@ -268,7 +270,7 @@ public Page getByGrupo(@PathVariable("grupo") String grupo, Pageable p @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su PESO no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/peso/{peso}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByPeso(@PathVariable("peso") double peso, Pageable pageable) { return productoService.findByPeso(peso, pageable); } @@ -285,7 +287,7 @@ public Page getByPeso(@PathVariable("peso") double peso, Pageable page @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su PRECIO_UNIDAD no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/precio-unidad/{precioUnidad}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByPrecioUnidad(@PathVariable("precioUnidad") double precioUnidad, Pageable pageable) { return productoService.findByPrecioUnidad(precioUnidad, pageable); } @@ -303,7 +305,7 @@ public Page getByPrecioUnidad(@PathVariable("precioUnidad") double pre @ApiResponse(responseCode = "404", description = "El Listado de Productos o Producto según su STOCK no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/stock/{stock}") - @PreAuthorize("hasRole('ROLE_USER')") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getByStock(@PathVariable("stock") int stock, Pageable pageable) { return productoService.findByStock(stock, pageable); } diff --git a/src/main/java/com/api/produc/sup/security/controllers/UsuarioController.java b/src/main/java/com/api/produc/sup/security/controllers/UsuarioController.java index 5d5036b..35a6b3f 100644 --- a/src/main/java/com/api/produc/sup/security/controllers/UsuarioController.java +++ b/src/main/java/com/api/produc/sup/security/controllers/UsuarioController.java @@ -6,6 +6,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -24,6 +26,7 @@ @RestController @RequestMapping("/api/v1/admin/usuarios") +@CrossOrigin(origins = "*") public class UsuarioController { @Autowired @@ -44,6 +47,7 @@ public class UsuarioController { @ApiResponse(responseCode = "404", description = "La Inserción del Usuario no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @PostMapping("/") + @PreAuthorize("hasRole('ROLE_ADMIN')") public ResponseEntity addUsuario(@RequestBody Usuario usuario) { try { @@ -68,6 +72,7 @@ public ResponseEntity addUsuario(@RequestBody Usuario usuario) { @ApiResponse(responseCode = "404", description = "La Actualización del Usuario no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @PutMapping("/") + @PreAuthorize("hasRole('ROLE_ADMIN')") public ResponseEntity updateUsuario(@RequestBody Usuario usuario) { try { @@ -93,6 +98,7 @@ public ResponseEntity updateUsuario(@RequestBody Usuario usuario) { @ApiResponse(responseCode = "404", description = "La Eliminación del Usuario no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @DeleteMapping("/{id}") + @PreAuthorize("hasRole('ROLE_ADMIN')") public ResponseEntity deleteUsuario(@RequestBody long id) { try { @@ -118,6 +124,7 @@ public ResponseEntity deleteUsuario(@RequestBody long id) { @ApiResponse(responseCode = "404", description = "El Listado de Usuarios no está Disponible ya que el recurso pedido no existe. Comprobar solicitud", content = @Content), @ApiResponse(responseCode = "500", description = "Se ha producido un error interno en el Servidor", content = @Content) }) @GetMapping("/listado") + @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public Page getAllUsuario(Pageable pageable) { return usuarioService.getAllUsuario(pageable); diff --git a/src/main/java/com/api/produc/sup/security/entities/Rol.java b/src/main/java/com/api/produc/sup/security/entities/Rol.java index 94e241f..76141cc 100644 --- a/src/main/java/com/api/produc/sup/security/entities/Rol.java +++ b/src/main/java/com/api/produc/sup/security/entities/Rol.java @@ -30,14 +30,7 @@ public class Rol { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private long id; - - /* - @NotNull - @Enumerated(EnumType.STRING) - @Type(type = "pgsql_enum") - @Column(columnDefinition = "rol") - private TipoRol rol; -*/ + @NotNull @Enumerated(EnumType.STRING) @Column(columnDefinition = "rol") diff --git a/src/main/java/com/api/produc/sup/security/jwt/JwtEntryPoint.java b/src/main/java/com/api/produc/sup/security/jwt/JwtEntryPoint.java index db33ab8..d4aeae0 100644 --- a/src/main/java/com/api/produc/sup/security/jwt/JwtEntryPoint.java +++ b/src/main/java/com/api/produc/sup/security/jwt/JwtEntryPoint.java @@ -19,9 +19,14 @@ public class JwtEntryPoint implements AuthenticationEntryPoint { private final static Logger logger = LoggerFactory.getLogger(JwtEntryPoint.class); @Override - public void commence(HttpServletRequest req, HttpServletResponse res, AuthenticationException e) throws IOException, ServletException { - logger.error("fail en el método commence"); - res.sendError(HttpServletResponse.SC_UNAUTHORIZED, "no autorizado"); + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { + logger.error("fail en el método commence: " + authException.getMessage()); + + response.resetBuffer(); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setHeader("Content-Type", "application/json"); + response.getOutputStream().print("{\"status\":401,\"error\":\"Unauthorized\",\"message\":\"No esta autorizado\"}"); + response.flushBuffer(); } } diff --git a/src/main/java/com/api/produc/sup/security/utils/CreateRoles.java b/src/main/java/com/api/produc/sup/security/utils/CreateRoles.java deleted file mode 100644 index c7a52ee..0000000 --- a/src/main/java/com/api/produc/sup/security/utils/CreateRoles.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.api.produc.sup.security.utils; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - -import com.api.produc.sup.security.entities.Rol; -import com.api.produc.sup.security.enums.TipoRol; -import com.api.produc.sup.security.services.RolService; - - -/** - * MUY IMPORTANTE: ESTA CLASE SÓLO SE EJECUTARÁ UNA VEZ PARA CREAR LOS ROLES. - * UNA VEZ CREADOS SE DEBERÁ ELIMINAR O BIEN COMENTAR EL CÓDIGO - * - */ - -/* -@Component -public class CreateRoles implements CommandLineRunner { - - @Autowired - RolService rolService; - - @Override - public void run(String... args) throws Exception { - Rol rolAdmin = new Rol(RolNombre.ROLE_ADMIN); - Rol rolUser = new Rol(RolNombre.ROLE_USER); - rolService.save(rolAdmin); - rolService.save(rolUser); - - - - } - - - -} - */ - diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 095ad47..5df91f6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -8,8 +8,8 @@ server.error.whitelabel.enabled=true spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=none #spring.jpa.hibernate.ddl-auto=update -spring.jpa.hibernate.show-sql=true -spring.datasource.url=jdbc:postgresql://localhost:5432/microdb_productos_supermercado?serverTimezone=UTC +spring.jpa.show-sql=true +spring.datasource.url=jdbc:postgresql://localhost:5432/microdb_productos_supermercado?stringtype=unspecified spring.datasource.username=postgres spring.datasource.password=postgres @@ -27,11 +27,11 @@ spring.data.rest.limit-param-name=limit spring.data.rest.default-page-size = 10 -# --- Habilitamos logging +# --- LOGGING logging.level.org.springframework.data=debug logging.level.=errors -# security +# --- SPRING SECURITY jwt.secret = secret jwt.expiration = 36000 \ No newline at end of file