2010-03-03 68 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