Обработка некоторой пользовательской проверки в контроллере пружины - PullRequest
0 голосов
/ 25 февраля 2019

Предположим, у меня есть функция проверки, найденная в userAuthService, необходимая для каждой функции OrderService

@RequestMapping(path = {"/", ""}, method = RequestMethod.GET)
public ResponseEntity<List<Order>> getAllOrders(@RequestHeader(value="userID") String userID) {
    boolean validUser = userAuthService.validateUserByID(userID);

    if(validUser) {
        return new ResponseEntity<>(orderService.getAllOrders(), HttpStatus.OK);
    } else {
        return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
    }
}
  1. Я знаю, что в идеале у контроллеров не должно быть логики.Это уместно для контроллера, чтобы иметь такую ​​логику аутентификации, или сервис заказа должен вызывать userAuthService напрямую?

  2. Как мне предотвратить это, если (допустимо) затем вернуть ... ещевозврат ... из дублирования в каждой функции CRUD службы deleteOrder, updateOrder и т. д ...

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Если проект позволяет это, переход к весенней безопасности будет вашим лучшим выбором.Если нет, я могу предложить вам два варианта:

1. Используя перехватчик preHandle, зарегистрируйте его для нужных конечных точек.Вы можете получить доступ к запросу от перехватчика, поэтому реализация логики его проверки должна быть возможной.Также возможно перенаправление с перехватчика.

Pro - более простая реализация

Con - нет признаков того, что это происходит в сервисе

2. Использование пружинного AOP, реализующего пользовательский доступконтроль перед аннотацией.Вы можете получить запрос, чтобы получить требуемый идентификатор пользователя.Вы не можете выполнить перенаправление из аспекта before, но вы можете определить и вызвать исключение авторизации, которое вы бы обработали в глобальном обработчике исключений и перенаправили оттуда.

Pro - аннотации, четко видимые, легкодобавить или удалить, можно легко сделать метод или аннотацию класса

Con - более сложная реализация

0 голосов
/ 25 февраля 2019

Стоит взглянуть на Spring Security для Аутентификация и Авторизация запросов.

Однако, если вы хотите сохранить егоЯ просто предлагаю обработать логику авторизации на уровне сервиса.Таким образом, из вашего контроллера должно быть достаточно вызова orderService.getAllOrders().

Чтобы избежать дублирования if else, вы можете создать собственное исключение во время выполнения и выбросить его из службы в случае сбоя авторизации.У вас может быть глобальный обработчик исключений, который позаботится о возврате соответствующих HTTP status code и message.

Подробнее см. this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...