Использование аннотации Spring Security для метода контроллера, расширяющего другой класс - PullRequest
5 голосов
/ 24 ноября 2011

У меня очень похожая конфигурация bean-компонентов безопасности для в этом примере .Примечание @Secured к методам контроллера работает правильно только в том случае, если оно относится к методу класса, который не подклассирует другой класс.Другими словами, следующий код не работает (исключение возникает во время инициализации компонента):

@Controller
@RequestMapping("/systeminfo")
public class SystemInfoController extends AbstractViewableController {

    @RequestMapping(method = RequestMethod.GET, value = "/")
    @Secured("ROLE_USER") // an exception below was raised
    public void view(HttpServletRequest request) {
    }
}

Вот исключение:

org.springframework.beans.factory.BeanCreationException: Error creating bean wit
h name 'systemInfoController' defined in file [C:\workspace\my\my-webapp
\target\classes\my\webapp\controller\SystemInfoController.class]: Initializa
tion of bean failed; nested exception is org.springframework.aop.framework.AopCo
nfigException: Could not generate CGLIB subclass of class [class my.webapp.c
ontroller.SystemInfoController]: Common causes of this problem include using a f
inal class or a non-visible class; nested exception is net.sf.cglib.core.CodeGen
erationException: java.lang.RuntimeException-->RequestMapping annotation cannot
be found on my.webapp.controller.SystemInfoController$$EnhancerByCGLIB$$e99f
e366

Поэтому я следую инструкции здесь и добавьте proxy-target-class="true" к <global-method-security ...> (не уверен, связано ли это), но аспект безопасности все еще теряется.Однако, если суперкласс удален, то защита будет применена должным образом, то есть переадресация на страницу входа.

Кто-нибудь знает, что происходит и как решить проблему, когда контроллеру необходимо расширить другойкласс?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

Вероятно, это ошибка в фабрике Spring Bean, сканере аннотаций Spring или генерации подкласса с использованием CGLIB.Spring не должен сканировать аннотации на подклассах, которые генерируются CGLIB напрямую, так как они потеряны.Он должен сканировать свой целевой класс.В этом случае он пытался сканировать @ResquestMapping на my.webapp.controller.SystemInfoController$$EnhancerByCGLIB$$e99fe366.

Однако, поскольку все это работает, если SystemInfoController не расширяет класс абстракций.Это указывает на то, что аннотация может быть потеряна только в том случае, если контроллер является подклассом, что предполагает, что это может быть ошибкой при создании прокси-подкласса или ограничением CGLIB.

0 голосов
/ 24 ноября 2011

Включены ли защищенные аннотации в файле security.xml

<global-method-security secured-annotations="enabled" />

Более того, эти аннотации работают только для бобов Spring. Вам нужно внедрить эти компоненты, а не просто создавать нормальные экземпляры. Попробуйте использовать Spring Dependency Injection.

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