Как отправить 401 как неавторизованный пользователь и 404, если запрос к базе данных возвратил нулевой объект в контроллере REST API веб-приложения Spring boot? - PullRequest
0 голосов
/ 27 апреля 2020

Я использую небольшую персонализированную систему безопасности из-за характера приложения и пытаюсь реализовать несколько простых возвратов ошибок в моем контроллере REST API. Это достаточно просто сделать в html контроллере страницы, как у меня в следующем:

@Controller
public class HomeController {

    @Autowired
    private UserService userService;

    @GetMapping("/home.html")
    public String home(Model model) {
        String redirect = "home";

        if(!userService.getCurrentUser().isCanAccessService()) {
            redirect = "unauthorized";
        }       
        return redirect;
    }
}

Я могу легко просто перенаправить его на неавторизованную страницу, которую я создал, так как я возвращаю строковое значение здесь , Однако, когда я go в REST API, это не так просто:

@RestController
public class bagelController {

    @Autowired
    private bagelService bagelService;

    @Autowired
    private UserService userService;

    @GetMapping("/rest/bagel/search")
    public Bagel searchBagel (@RequestParam(value = "bagel", required = false) String bagel, 
            @RequestParam(value = "bagelInd", required = false, defaultValue = "1") int bagelInd) {

        Bagel bagel;
        if(!userService.getCurrentUser().isBagelEditAccess()) {
            bagel = null;
            // I want to return a 401 or direct to my unathorized page if I get an invalid user here.
        }
        else {
            bagel = bagelService.getbagel(bagel, bagelInd);
            // if my bagel object returns null, I want to return a 404 or direct to a 404 not
               found page here.
        } 
        return bagel; 
    }

Ответы [ 3 ]

3 голосов
/ 27 апреля 2020

Вы можете иметь ControllerAdvice , который обрабатывает исключения и их код возврата HTTP. Затем вы можете аннотировать метод в нем следующим образом, например:

@ExceptionHandler(NoSuchEntityException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)

Это будет возвращать код 404 каждый раз, когда он встречает NoSuchEntityException (пользовательское исключение). Таким образом, вы можете выдать такое исключение, когда проверяете, является ли объект нулевым. Вы можете использовать то же самое для 401 или любого другого HTTP-кода.

1 голос
/ 27 апреля 2020

Один из способов сделать это.

    @GetMapping("/rest/bagel/search")
    public ResponseEntity<Bagel> searchBagel (@RequestParam(value = "bagel", required = false) String bagel, 
            @RequestParam(value = "bagelInd", required = false, defaultValue = "1") int bagelInd) {

        Bagel bagel = null;
        if(!userService.getCurrentUser().isBagelEditAccess()) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
        else {
            bagel = bagelService.getbagel(bagel, bagelInd);
            if(bagel == null) { 
              return ResponseEntity.notFound().build();
            }
        } 
        return ResponseEntity.ok(bagel); 
    }
0 голосов
/ 27 апреля 2020

Вы можете создавать собственные исключения в вашем приложении для этого сценария, такие как BagelNotFoundException и UnauthorizedException. Оба эти пользовательских класса исключений могут расширять класс Exception или более определенных c классов из java иерархии исключений. Вы можете аннотировать эти пользовательские классы исключений с помощью аннотации @ResponseStatus, чтобы предоставить код состояния http, который должен быть отправлен в ответе.

Затем вам нужно выбросить объекты этих исключений в свой контроллер.

После создания этого исключения в вашем приложении должен присутствовать обработчик исключений, чтобы позаботиться об этих исключениях. То же самое можно определить с помощью @ControllerAdvice и @ExceptionHandler в ваших пользовательских классах обработчиков исключений.

Таким образом, вы сможете отправить соответствующий ответ клиенту, а клиентское приложение должно перенаправить пользователя на ошибку страницы на основе полученного кода ответа.

Надеюсь, это поможет!

...