簡體   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