[英]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.