[英]How do I enable strict validation of JSON / Jackson @RequestBody in Spring Boot REST API?
[英]How to correct OverPosting in Spring Boot Rest Api with parameter @RequestBody Json request?
我有一个驱动程序未配置为限制允许将请求的哪些属性映射到 model,因此该方法可用于执行 OverPosting 或 UnderPosting 攻击。
我不希望在关键应用程序中将我不想在 BD 中存储或修改的参数放入。
在没有 REST 的项目中,我看到他们使用 @InitBinder 方法解决并配置了“setDisallowedFields”、“setAllowedFields”和“setRequiredFields”,但是当使用 json @RequestBody 参数时映射到 DTO 我不能限制,另外我有几个控制器从同一个 DTO 接收不同的属性
DTO
public class ImagenAyudaDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Integer idImagenAyuda;
private String urlImagen;
private String estado;}
Controller
@PostMapping(path = "/getdto")
public ResponseEntity<ImagenAyudaDTO> getDto(
@RequestBody(required = true) @Valid ImagenAyudaDTO i
) {
Logger.info("getDto request " + i.toString());
ImagenAyudaDTO im = new ImagenAyudaDTO();
im.setEstado("D");
im.setIdImagenAyuda(new Integer(2));
im.setUrlImagen("https://start.spring.io/");
Logger.info("getDto Response " + im.toString());
return new ResponseEntity<ImagenAyudaDTO>(im, HttpStatus.OK);
}
粘合剂
@InitBinder
public void filterGetdto(WebDataBinder dataBinder) {
final String[] DISALLOWED_FIELDS = new String[] { "estado" };
final String[] ALLOWED_FIELDS = new String[] { "idImagenAyuda", "urlImagen" };
final String[] REQUIRED_FIELDS = new String[] { "idImagenAyuda", "urlImagen" };
dataBinder.setDisallowedFields(DISALLOWED_FIELDS);
dataBinder.setAllowedFields(ALLOWED_FIELDS);
dataBinder.setRequiredFields(REQUIRED_FIELDS);
}
来自 Postman 的请求:
我希望有一个活页夹类型验证,使我无法使用不应在请求中使用的 DTO 字段,考虑到在同一个 class 中,我可以有多个使用相同 DTO 的控制器
我的英语不好,这就是谷歌翻译的原因。
谷歌搜索,我找到了一个选项https://www.baeldung.com/javax-validation-groups,javax验证组,它适用于当我们需要对 bean 的一组字段应用约束时,然后我们想要对同一 bean 的另一组字段应用约束。
所有javax验证约束都有一个groups属性,这里可以指定约束所属的组名,指定组接口名。
@Email(groups = InformacionBasica.class)
private String email;
@NotBlank(groups = InformacionBasica.class)
private String telefono;
@NotBlank(groups = {InformacionBasica.class, InformacionAvanzada.class})
private String captcha;
@NotBlank(groups = InformacionAvanzada.class)
private String direccion;
例如来自 rest spring 引导服务:
import javax.validation.Valid;
import org.springframework.validation.annotation.Validated;
@Validated
public class PersonaRest{
@PostMapping("/algoBasica")
@Validated(InformacionBasica.class)
public ResponseEntity hacerAlgo(@Valid @RequestBody PersonaTO p) {
try {
personaServicio.hacerAlgo();
return new ResponseEntity(Boolean.TRUE, HttpStatus.OK);
} catch (EmptyResultDataAccessException e) {
return new ResponseEntity(
"Informacion basica necesaria",
HttpStatus.BAD_REQUEST);
}
}
@PostMapping("/algoAvanzada")
@Validated(InformacionAvanzada.class)
public ResponseEntity hacerAlgo(@Valid @RequestBody PersonaTO p) {
try {
personaServicio.hacerAlgo();
return new ResponseEntity(Boolean.TRUE, HttpStatus.OK);
} catch (EmptyResultDataAccessException e) {
return new ResponseEntity(
"Informacion avanzada necesaria",
HttpStatus.BAD_REQUEST);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.