Spring-Security 3 / Spring MVC и страшные @ Secured / RequestMapping - PullRequest
3 голосов
/ 04 марта 2010

У меня было много проблем с добавлением защищенных аннотаций в мои контроллеры.

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

public class MyController implements InitializingBean {

    @Secured(value="ROLE_ADMIN")
    @RequestMapping(method = RequestMethod.GET, value = "/{id}/edit")
    public String getView(Model model, @PathVariable("id") long id) {
        return "some view";
    }
}

это не удалось с:

WARN PageNotFound: 962 - Нет сопоставления найдено для HTTP-запроса с URI [...]

удаление аннотации @Secured будет работать, но, очевидно, я не хотел этого делать. после большого количества потерянного времени в сети я заметил, что последнее различие между рабочим и нерабочим контроллером было то, что он реализовал интерфейс InitializingBean. И теперь это работает как шарм:

public class MyController{

    @Secured(value="ROLE_ADMIN")
    @RequestMapping(method = RequestMethod.GET, value = "/{id}/edit")
    public String getView(Model model, @PathVariable("id") long id) {
        return "some view";
    }
}

Может кто-нибудь помочь мне понять это поведение?

1 Ответ

12 голосов
/ 04 марта 2010

Это происходит из-за того, что доступ к аннотациям теряется, когда аспект безопасности применяется с использованием динамического прокси-сервера JDK, что происходит по умолчанию, когда рекомендуемый компонент реализует какие-либо интерфейсы.

Чтобы решить эту проблему, вы должны указать Spring Security применять только прокси на основе целевого класса, используя <global-method-security proxy-target-class = "true" ...> ... (<aop:config proxy-target-class = "true" /> тоже работает).

Подробнее о прокси AOP здесь .

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