Spring-Security 3/Spring MVC和可怕的@Secured/RequestMapping

fas*_*seg 3 java spring-mvc spring-security

我在向控制器添加安全注释时遇到了很多问题.

事实证明让我的Controller实现一个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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这失败了:

WARN PageNotFound:962 - 找不到带URI的HTTP请求的映射[...]

删除@Secured Annotation会起作用,但显然我不想这样做.在网上浪费了大量时间之后,我注意到工作和非工作控制器之间的最后一个区别是它实现了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";
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我理解这种行为吗?

axt*_*avt 12

发生这种情况是因为使用JDK动态代理应用安全方面时会丢失对注释的访问,这在默认情况下会在建议的bean实现任何接口时发生.

要解决此问题,您应该告诉Spring Security仅使用<global-method-security proxy-target-class = "true" ...> ...(也<aop:config proxy-target-class = "true" />适用)基于目标类的代理.

更多关于AOP代理的信息.