2010-03-03 69 views
3

我在将控制器添加安全注释时遇到了很多问题。Spring-Security 3/Spring MVC和令人恐惧的@ Secured/RequestMapping

事实证明,让我的控制器实现一个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注释会的工作,但显然我不想这样做。 在网络上浪费大量时间之后,我发现工作和非工作控制器之间的最后差异在于它实现了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"; 
    } 
} 

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

回答

12

这是因为当使用JDK动态代理,这恰好在默认情况下,当告知Bean实现的任何接口应用的安全方面获得了注释丢失。

为了解决这个问题,你应该告诉Spring Security只使用<global-method-security proxy-target-class = "true" ...> ...<aop:config proxy-target-class = "true" />也可以)应用基于目标类的代理。

更多关于AOP代理here