Весенняя загрузка: это безопасно? Ключ Api как инициатор запроса против ключа Api через Spring Boot Security

#java #spring-boot #spring-security #api-key

#java #spring-boot #spring-security #api-ключ

Вопрос:

Вопрос: является ли моя реализация безопасной (по стандартам API Key) ИЛИ такой же безопасной, как при использовании Spring Boot Security?

Я создал Spring Boot API, но вместо того, чтобы использовать Spring Boot Security для реализации безопасности ключа Api, я написал свою собственную реализацию ключа API. Ключ API передается как @RequestHeader в каждом «защищенном» запросе (см. «/ booking / cancel» ниже).

Контроллер:

 @RequestMapping(value = "/booking/cancel",
        consumes = { "application/json" },
        method = RequestMethod.POST)
public ResponseEntity<Void> cancelOrder(@RequestBody Cancellation cancellation, 
                                       @RequestHeader String apiKey) {

        if(apiKey == null) {
            return new ResponseEntity<Void>(HttpStatus.NOT_ACCEPTABLE);
        }

        long bookingProviderId;
        try {
            bookingProviderId = bookingService.getIdFromApiKey(apiKey);
            if (bookingProviderId < 0) {
                return new ResponseEntity<Void>(HttpStatus.NOT_ACCEPTABLE);
            }
        } catch (ApplicationException e) {
            e.printStackTrace();
            return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
        }

        //More code here...
}
 

Уровень обслуживания:

Функция getIdFromApiKey существует на моем уровне обслуживания и вызывает объект Dao. Он возвращает long (Id), который я впоследствии могу использовать для управления доступом в контроллере (например, запретить пользователю отменять чужой заказ).

 public long getIdFromApiKey(String apiKey) throws ApplicationException {
    return apiKeyDao.selectId(apiKey);
}
 

Уровень Dao:

 public long getApiKey (String apiKey) throws DataAccessException {

    BookingProvider bp = jdbcTemplate.queryForObject("SELECT * FROM BookingProvider WHERE apiKey = ?", BeanPropertyRowMapper.newInstance(BookingProvider.class), apiKey);

    if(bp == null)
        return -1;
    else
        return bp.getId();
}