2011-11-09 54 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>即可。