2015-10-28 9 views
0

У меня есть весенняя загрузка 1.3.0-BUILD-SNAPSHOT с проектом SpringSecurity, и меня беспокоит безопасность конечных точек REST. У меня есть CORS фильтр определен:Spring MVC OPTIONS

@Configuration 
public class CorsConfiguration { 

    @Bean 
    public WebMvcConfigurer corsConfigurer() { 

     return new WebMvcConfigurerAdapter() { 

      @Override 
      public void addCorsMappings(CorsRegistry registry) { 

       registry.addMapping("/**").allowedOrigins("*") 
         .allowedHeaders("Access-Control-Allow-Origin", "*"   )  "x-requested-with") 
         .allowedHeaders("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE") 
         .allowedMethods("GET", "POST", "PUT", "DELETE") 
         .allowedMethods("Access-Control-Allow-Headers", "Content-Type") 
         .maxAge(3600); 

      } 

     }; 
    } 
} 

И у меня есть контроллер REST:

@Controller 
@Transactional 
public class Controller extends BaseController { 

    @Autowired 
    private QuestionService questionService; 

    @RequestMapping(value = "/questions", method = RequestMethod.GET) 
    @ResponseBody 
    public List<Question> getAllQuestions() { 
     return questionService.getAllAvailableQuestions(); 
    } 

    ... 
} 

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

Allow → GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH 
Cache-Control → no-cache, no-store, max-age=0, must-revalidate 
Content-Length → 0 
Date → Wed, 28 Oct 2015 16:32:12 GMT 
Expires → 0 
Pragma → no-cache 
Server → Apache-Coyote/1.1 
X-CSRF-HEADER → X-CSRF-TOKEN 
X-CSRF-PARAM → _csrf 
X-CSRF-TOKEN → 83983056-f904-449e-a215-fe9f9492866b 
X-Content-Type-Options → nosniff 
X-Frame-Options → DENY 
X-XSS-Protection → 1; mode=block 

Я думал, что Spring MVC игнорирует вызов OPTIONS по умолчанию. Но я думаю, я также не понимаю, почему я возвращаю Allow → GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH, когда я разрешаю только GET для этого вызова. Во всем приложении я разрешаю только GET, PUT, POST, DELETE, поэтому я не знаю, почему возвращаются другие значения, и что это значит. И что самое главное, это уязвимость безопасности?

+0

Ничего в вашем вопросе о Spring Security пока. Как выглядит ваш звонок? Почему Spring игнорирует «ОПЦИИ» по умолчанию и как это должно работать с CORS, где нужны «ОПЦИИ»? Что делает ответ, вы получаете проблему безопасности? И где и как вы определили, что разрешены только GET, PUT, POST, DELETE? 'addCorsMappings' - это только CORS, больше ничего. – zeroflagL

+0

Да, я все еще узнаю, что все это значит, пройдя проверку безопасности. Я упомянул Spring Security, потому что проект содержит его, и я подумал, что это может иметь отношение к этой теме. Я провел некоторое исследование и прочитал, что ОПЦИИ игнорировались по умолчанию, но, возможно, это была плохая ссылка.В моей конфигурации CORS я допускаю только эти 4 метода, поэтому я не понимаю, почему ОПЦИИ говорят, что «GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH» разрешено, когда CORS и мой собственный REST конечные точки не используют их все. – sonoerin

+1

CORS применим только для браузеров (т. Е. AJAX!), А заголовки ответных сообщений CORS начинаются с 'Access-Control-'. Контроллер может обрабатывать запросы 'GET' только для'/questions'. Поэтому, если у вас нет другого обработчика для этого URL-адреса, ошибка будет возвращена для каждого другого метода запроса. И это верно для каждого запроса: нет соответствующего обработчика -> статус 4xx. – zeroflagL

ответ

3

Если вы посмотрите на JavaDoc из BaseFrameworkServlet#setDispatchOptionsRequest() содержит следующий комментарий:

Установите, должен ли этот сервлет направить HTTP OPTIONS запроса на #doService метод по умолчанию является «ложным», применяя javax.servlet.http.HttpServlet «s поведение по умолчанию (т.е. перечисление всех стандартных методов HTTP-запросов в ответ на запрос OPTIONS).


Но я предполагаю, что я тоже не понимаю, почему я вижу Разрешить → GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH возвращается, когда я только позволит получить за что вызов.

Как уже отмечался в комментариях выше, запрос не обрабатываются Spring MVC диспетчер, но HttpServletRequest#doOptions, который перечисляет методы HTTP сервер поддерживает и ничего не знает о вашем отображении контроллера.

Если вы хотите, чтобы проверить это поведение, которое вы можете поставить точки останова в методе doServiceDispatcherServlet «s и HttpServlet сек doOptions метод и посмотреть, какой из них вызывается. Если вы хотите, чтобы запрос OPTIONS обрабатывался диспетчером, вы можете включить его, используя один из способов, описанных here.

0

Для применения Spring Загрузочного добавить к application.properties файла следующего свойства:

spring.mvc.dispatch-options-request=true 

Он будет выполнять работу.