gpt4 book ai didi

java - 如何使用参数 @RequestBody Json 请求纠正 Spring Boot Rest Api 中的 OverPosting?

转载 作者:行者123 更新时间:2023-12-02 08:39:54 27 4
gpt4 key购买 nike

我的驱动程序未配置为限制允许将请求的哪些属性映射到模型,因此该方法可用于执行 OverPosting 或 UnderPosting 攻击。

我不希望在关键应用程序中放置我不想在 BD 中存储或修改的参数。

在没有 REST 的项目中,我看到他们用一种方法来解决@InitBinder 并配置为“setDisallowedFields”、“setAllowedFields”和“setRequiredFields”,但是当使用映射到 DTO 的 json @RequestBody 参数时,我无法进行限制,而且我有几个 Controller 从同一 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);
}

Binder

    @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 的请求:
Request from Postman

我希望有一个 Binder 类型验证,禁止我访问不应在请求中使用的 DTO 字段,考虑到在同一个类中我可以有多个使用相同 DTO 的 Controller

最佳答案

我英语不好,所以才使用 Google 翻译。

谷歌搜索,我找到了一个选项 https://www.baeldung.com/javax-validation-groups ,javax 验证组,它适用于当我们需要对 bean 的一组字段应用约束,然后我们想要对同一 bean 的另一组字段应用约束时。

所有javax验证约束都有一个groups属性,在这个属性中可以指定该限制所属的组的名称,指定组接口(interface)的名称。

  1. 创建接口(interface):这些接口(interface)将是限制组的名称(InformacionBasica、InformacionAvanzada)。
  2. 然后使用 bean 上的接口(interface)。


@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;

例如来自休息spring boot服务:



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);
}

}
}

关于java - 如何使用参数 @RequestBody Json 请求纠正 Spring Boot Rest Api 中的 OverPosting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61444509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com