Прошло более двух лет с тех пор, как этот вопрос был задан, но из-за проблем, с которыми я столкнулся сегодня, я бы предпочел не использовать @Secured
, @PreAuthorize
и т. Д. На @Controller
с.
Что мне не помогло, так это @Validated
в сочетании с @Secured
контроллером:
@Controller
@Secured("ROLE_ADMIN")
public class AdministrationController {
// @InitBinder here...
@RequestMapping(value = "/administration/add-product", method = RequestMethod.POST)
public String addProductPost(@ModelAttribute("product") @Validated ProductDto product, BindingResult bindingResult) {
// ...
}
Validator просто не запускается (Spring MVC 4.1.2, Spring Security 3.2.5) и проверки не выполняются.
Подобные проблемы вызваны прокси-серверами CGLIB, используемыми Spring (когда класс не реализует интерфейс, Spring создает прокси CGLIB; если класс реализует какой-либо интерфейс, генерируется прокси JDK - документация , хорошо объяснено здесь и здесь ).
Как упомянуто в ответах, которые я связал выше, не лучше использовать аннотации Spring Security на сервисном уровне, который обычно реализует интерфейсы (поэтому используются прокси JDK), поскольку это не приводит к таким проблемам.
Если вы хотите защитить веб-контроллеры, лучше использовать <http>
и <intercept-url />
, которые привязаны к конкретным URL-адресам, а не к методам в контроллерах и работают довольно хорошо. В моем случае:
<http use-expressions="true" disable-url-rewriting="true">
...
<intercept-url pattern="/administration/**" access="hasRole('ROLE_ADMIN')" />
</http>