2016-12-01 2 views
0

Это происходит в приложении Spring MVC, где также используется Spring Security. Я настроил запрос с отображением «/user/save» так, что только администраторы имеют доступ к нему:Запрос POST получает ответ 405 вместо того, чтобы обрабатываться обработчиком доступа

<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')"/> 
<intercept-url pattern="/user/**" access="hasAnyAuthority('ROLE_ADMIN','ROLE_OPERATOR'"/> 

Несанкционированных запросы обрабатываются

<access-denied-handler error-page="/denied"/> 

Когда я делаю /user/save запрос, имеющим только ROLE_OPERATOR я получаю следующее предупреждение :

WARN http-nio-8080-exec-20 servlet.PageNotFound:208 - Request method 'POST' not supported 

и /denied не попасть. Зачем?

Ответы на подобные проблемы предлагают настроить csrf для POST-запросов, но запросы POST работают для ROLE_ADMIN, так что здесь не должно быть проблем.

Я попытался определения типов методов в конфигурации системы безопасности, как это:

<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')" method="GET"/> 
<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')" method="POST"/> 

, но это не помогло.

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

Что может вызывать такое поведение?

ответ

1

В моем случае проблема была в методе контроллера для запроса /denied. У него была версия GET, но не версия POST. Добавление версии POST следующим образом:

@RequestMapping(value = "/denied", method = RequestMethod.POST) 
public @ResponseBody Response userAccessDeniedForPost() { 
    ... 
} 

решил проблему.

Смежные вопросы