我在向控制器添加安全注释时遇到了很多问题。
原来让我的控制器实现初始化bean是个坏主意。
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注释可以工作,但显然我不想这样做。 在网上浪费了很多时间之后,我注意到一个工作的和不工作的控制器之间的最后一个区别是它实现了initializengbean接口。现在这就像一个符咒:
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"; } }
有谁能帮我理解这种行为吗?
这是因为当使用jdk动态代理应用安全特性时,对注释的访问将丢失,而默认情况下,当advancedbean实现任何接口时,都会发生这种情况。
为了解决这个问题,您应该告诉spring security只应用基于目标类的代理,使用 <global-method-security proxy-target-class = "true" ...> ... ( <aop:config proxy-target-class = "true" /> 也工作。
<global-method-security proxy-target-class = "true" ...> ...
<aop:config proxy-target-class = "true" />
关于aop代理的更多信息 here 。