我在向控制器添加安全注释时遇到了很多问题。
事实证明让我的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";
}
}
这失败了:
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";
}
}
有人能帮我理解这种行为吗?
答案 0 :(得分:12)
这是因为当使用JDK动态代理应用安全方面时,对注释的访问会丢失,默认情况下,当建议的bean实现任何接口时,会发生这种情况。
要解决此问题,您应该告诉Spring Security仅使用基于目标类的代理,<global-method-security proxy-target-class = "true" ...> ...
(<aop:config proxy-target-class = "true" />
也适用)。
有关AOP代理here的更多信息。