2011-11-09 61 views
0

是否可以使用切入點保護我的@Controller類?我嘗試過:Spring Security/AspectJ切入點

<global-method-security pre-post-annotations="enabled"> 
    <!-- Block anything ending with the word 'Controller'--> 
    <protect-pointcut expression="execution(* my.pkg.*Controller.*(..))" access="NON_EXISTANT_ROLE"/> 
</global-method-security> 

從理論上講,我永遠無法擊中控制器,因爲任何用戶都不存在該角色。但是,控制器運行良好。

+0

您使用的是哪種版本的彈簧安全? – Ritesh

+0

我使用的是3.0.7版本 – user973479

+0

我在3.0.5之前有過這個問題。還要確保在控制器上下文中存在全局方法安全性。 – Ritesh

回答

0

請參閱Spring Security FAQ(強調我的)。

在一個Spring web應用程序,其保持 Spring MVC的豆用於調度的servlet應用上下文是常從 主應用程序上下文分離。它通常在名爲 myapp-servlet.xml的文件中定義,其中「myapp」是分配給web.xml中的Spring DispatcherServlet的名稱。一個應用程序可以有多個 DispatcherServlet,每個都有自己獨立的應用程序上下文。 這些「子」上下文中的bean對於 應用程序的其餘部分不可見。 「父」應用程序上下文由您在web.xml中定義的ContextLoaderListener加載,並且所有 子上下文都可見。此父上下文通常是您定義 安全配置的位置,包括 元素)。因此,應用於 中的方法的任何安全限制都將不會被強制執行,因爲從DispatcherServlet上下文中無法看到該Bean的 。您需要將 聲明移至Web上下文,或將需要保護的bean移至主應用程序上下文中。

通常我們會建議在服務層 上應用方法安全性,而不是在單獨的Web控制器上。

如果將切入點應用於服務層,則只需在應用的安全上下文中設置<global-method-security>即可。