繁体   English   中英

如何在 Spring 引导 Rest Api 中使用参数@RequestBody ZEED8D8342408A85EE633 request 纠正 OverPosting?

[英]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属性,这里可以指定约束所属的组名,指定组接口名。

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


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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM