Проверьте, является ли результат @PathVariable Data Binder нулевым, и выведите 404 - PullRequest
0 голосов
/ 30 января 2019

В моем приложении для весенней загрузки у меня есть метод Spring mvc, который защищен с помощью Spring Security. Я передаю идентификатор этому методу, поскольку переменная пути и преобразователь аргумента данных Spring находят и связывают объект, но когда идентификатор недействителен, объект является нулевым.;я хочу бросить 404, когда сущность равна нулю;потому что пружинная безопасность PreAuthorize требует ненулевой сущности для проверки авторизации пользователя;мой код:

 @PutMapping(value = "/{address}")
    @PreAuthorize("isAuthenticated() and (#address.user.id == #user.id)")
    public ResponseEntity<ResponseModel> update(@Valid @RequestBody AddressModel addressModel, @PathVariable Address address, @AuthenticationPrincipal User user) {

        try {
            addressService.update(user, address, addressModel);
        } catch (Exception e) {
            return new ResponseEntity<>(new ResponseModel(e.getMessage(), ResponseModel.ResponseStatus.ERROR), HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(new ResponseModel(messages.get("def.op.success"), ResponseModel.ResponseStatus.SUCCESS), HttpStatus.OK);
    }

также я тестировал

@PreAuthorize("isAuthenticated() and (#address != null and #address.user.id == #user.id)")

, но он возвращает ошибку 403;

1 Ответ

0 голосов
/ 30 января 2019

Разве вы не можете просто переместить аннотацию к своему сервису?

 @PutMapping(value = "/{address}")
    //@PreAuthorize("isAuthenticated() and 
          //(#address.user.id == #user.id)") <-- move to service method
    public ResponseEntity<ResponseModel> update(
             @Valid @RequestBody AddressModel addressModel, @PathVariable Address address, 
                        @AuthenticationPrincipal User user) {

        if(address == null){
           //throw some exception that gets translated to 404
        }

        try {
            //check will be applied on call to service
            addressService.update(user, address, addressModel);
        } catch (Exception e) {
            return new ResponseEntity<>(new ResponseModel(e.getMessage(), 
                     ResponseModel.ResponseStatus.ERROR), HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(new ResponseModel(messages.get("def.op.success"), 
                 ResponseModel.ResponseStatus.SUCCESS), HttpStatus.OK);
    }
...