Ограничить использование сервера для внутреннего использования

#java #spring #spring-mvc #spring-security

#java #spring #spring-mvc #spring-безопасность

Вопрос:

У меня есть веб-сервис REST, использующий spring MVC, который ориентирован на внешний интерфейс. Я хотел бы ограничить доступ к некоторым вызовам REST для использования администратором и для вызова других серверов в той же внутренней сети.

Пока я могу придумать следующие решения:

  1. Используйте Spring-Security, чтобы ограничить сопоставление с подсетью, используя доступ «hasIpAddress»
  2. Отделите чувствительные вызовы REST от их собственного контроллера и напишите AOP pointcut, который считывает HttpServletRequest для IP-адреса и проверяет по белому списку

Мне не нравится ни то, ни другое решение. (1) не дает мне достаточной гибкости, я могу находиться в нескольких подсетях и, возможно, захочу открыть только диапазон IP. (2) Дает мне почти именно то, что я хочу, но это кажется халтурным, должен быть лучший способ сделать это.

Ответ №1:

(2) почему вы не хотите использовать «стандартные» аннотации, такие как @PreAuthrize. Вы можете поместить их в методы, поэтому вам не нужно перемещать чувствительные методы REST на другой контроллер.

Комментарии:

1. Я не возражаю против переноса чувствительных методов в свой собственный контроллер, это кажется логичным, независимо от того, какой подход я использую. Моя проблема с spring Security заключается в том, что у меня не может быть более детального контроля для создания белого списка или диапазона IP

Ответ №2:

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

Ответ №3:

Если вы используете обратный прокси, такой как Apache, самым простым решением было бы обработать это там.

В Spring Security вы бы создали подкласс AbstractPreAuthenticatedProcessingFilter , который содержит логику, связанную с вашим IP, и проверяет подлинность запроса как основного с помощью ROLE_ADMIN .