#java #spring #spring-mvc #spring-security
#java #spring #spring-mvc #spring-безопасность
Вопрос:
У меня есть веб-сервис REST, использующий spring MVC, который ориентирован на внешний интерфейс. Я хотел бы ограничить доступ к некоторым вызовам REST для использования администратором и для вызова других серверов в той же внутренней сети.
Пока я могу придумать следующие решения:
- Используйте Spring-Security, чтобы ограничить сопоставление с подсетью, используя доступ «hasIpAddress»
- Отделите чувствительные вызовы 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
.