2012-04-30 23 views
5

我想了解在Spring-MVC应用程序中定义Spring Security的推荐方式,其中bean定义被分割到多个父/子上下文中。Spring Security + MVC:关于上下文定义和bean范围的问题

例如,我目前的应用程序的web.xml如下所示,(我的理解是相当标准)

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
    classpath:applicationContext.xml 
    /WEB-INF/securityContext.xml 
    </param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<servlet> 
    <servlet-name>spring-mvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>spring-mvc</servlet-name> 
    <url-pattern>/app/*</url-pattern> 
</servlet-mapping> 

所以,我在/定义的标准ContextLoaderListener,它加载我的全球CONFIGS - applicationContext.xmlsecurityContext.xml。 我还定义了弹簧mvc DispatcherServlet/app/,它从spring-mvc-servlet.xml加载它自己的豆。

据我所知,在spring-mvc-servlet.xml中定义的配置对任何一个顶级上下文文件中定义的配置都是不可见的。

那么定义应用程序级安全性概念的最佳位置在哪里?例如,我想添加以下过滤器。

<security:http pattern="/oauth/token" create-session="stateless" entry-point-ref="oauthAuthenticationEntryPoint"> 
    <security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" /> 
</security:http> 

这是为了通过这个过滤器请求对/app/oauth/token通,并获得基本的认证处理。因为这直接关系到Spring-MVC应用程序的问题,所以我最初在spring-mvc-context.xml中定义了它(这就是为什么app不包含在url中)的原因。

但是,这意味着它对securityContext.xml中定义的安全配置不可见,所以它被忽略。

所以,我把它移动到securityContext.xml,但这样做,也必须移动所有的依赖关系。 我很快结束了将所有内容移动到applicationContext.xml,这使spring-mvc-context.xml几乎为空。

这是常见的吗?什么是在顶级上下文中定义的内容和在子上下文中定义的内容之间的区别?

鉴于spring-mvc定义了一系列控制器,我想标记为@Secured,如果控制器对安全上下文不可见,这些控制器将如何处理?

我是否需要将我的<mvc:annotation-driven />servlet.xml移至全球applicationContext.xml? 我是否需要spring-mvc-servlet.xml内的其他配置来告诉它参与Spring安全性?

我读过documentation on Spring-MVC,但关于如何配置它的细节很少。 此外,Spring OAuth examples似乎定义了一个配置文件中的所有内容,这似乎不是真实世界,似乎与我读过的其他示例相矛盾。

回答

7

第一:内applicationContext.xmlContextLoaderListener)中定义的bean不能访问spring-mvc-servlet.xmlDispatcherServlet)中定义的一个而不是周围的其他方式。

你问:


由于弹簧MVC定义了一系列的控制器,这是我要标记为@Secured的,如何将这些处理如果控制器不是安全可见背景?

所以此工程没有问题,因为控制器必须在spring-mvc-servlet.xml来定义的,因此他们“看到” applicationContext.xml


定义Spring Security的东西,我需要我从移动将servlet.xml添加到全局applicationContext.xml中?

没有


我需要的弹簧MVC-servlet.xml中内其他配置来告诉它参与到Spring的安全性?

没有


...这让弹簧MVC-context.xml中几乎是空的。这是常见的吗?

spring-mvc-context.xml应该包含与Web Stuff(除了secrutiy)相关的所有东西。所以spring-mvc-context.xml的公用部分是@Controller组件扫描,一些拦截器(mvc:interceptors),mvc:resourcesmvc:default-servlet-handlermvc:view-controllerReloadableResourceBundleMessageSourceCookieLocaleResolver.SimpleMappingExceptionResolver ...

顺便说一句:如果你使用组件扫描,那么你就需要两个其中一个在applicationContext.xml处扫描@Service@Repository@Component(但不是@Controller),第二个在spring-mvc-context.xml中只扫描@Controller


@see也是这个问题:ContextLoaderListener or not?它从一个角度另一点讨论的主题。

相关问题