Spring Security + MVC:关于上下文定义的问题&豆范围

时间:2012-04-30 00:41:54

标签: java spring spring-mvc spring-security

我正在尝试理解在Spring-MVC应用程序中定义Spring Security的推荐方法,其中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定义了一个标准/,它会加载我的全局配置 - applicationContext.xmlsecurityContext.xml。 我还在DispatcherServlet定义了spring mvc /app/,它从spring-mvc-servlet.xml加载了自己的bean。

根据我的理解,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的原因)。

但是,这意味着它在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似乎在单个配置文件中定义了所有内容,这看起来并不真实,并且似乎与我读过的其他示例相矛盾。

1 个答案:

答案 0 :(得分:7)

首先:applicationContext.xmlContextLoaderListener)中定义的bean无法访问spring-mvc-servlet.xmlDispatcherServlet)中定义的bean,但不能访问其他方式。

你问:


  

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

所以这没有问题,因为必须在spring-mvc-servlet.xml中定义控制器,所以他们“看到”applicationContext.xml中定义的Spring Security内容


  

我是否需要将我的servlet.xml移至全局applicationContext.xml?

没有


  

我是否需要在spring-mvc-servlet.xml中进行其他配置以告诉它参与Spring安全性?

没有


  

...这使得spring-mvc-context.xml几乎为空。这是常见的吗?

spring-mvc-context.xml应该包含与Web Stuff相关的所有内容(除了secrutiy)。因此,spring-mvc-context.xml的常见部分是@Controller的组件扫描,一些拦截器(mvc:interceptors),mvc:resourcesmvc:default-servlet-handlermvc:view-controller,{ {1}},ReloadableResourceBundleMessageSourceCookieLocaleResolver ...

BTW:如果你使用组件扫描,那么你需要其中两个,一个在.SimpleMappingExceptionResolver来扫描applicationContext.xml @Service@Repository(但不是@Component)和@Controller中的第二个仅扫描spring-mvc-context.xml


@参见这个问题:ContextLoaderListener or not?从另一个角度讨论主题。