5

我试图了解在 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. 我还在 处定义了 spring 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(这就是为什么appurl 被排除在外的原因)。

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

因此,我将其移至securityContext.xml,但这样做时,还必须移动所有依赖项。我很快最终将所有内容移至applicationContext.xml,这spring-mvc-context.xml几乎是空的。

这很常见吗?顶级上下文中定义的内容和子上下文中定义的内容之间的建议划分是什么?

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

我需要将我<mvc:annotation-driven />的从 the移动servlet.xml到 globalapplicationContext.xml吗?我需要额外的配置spring-mvc-servlet.xml来告诉它参与 Spring 安全性吗?

我已经阅读了Spring-MVC 上的文档,但是关于如何配置它的细节很少。此外,Spring OAuth 示例似乎在单个配置文件中定义了所有内容,这似乎不是很真实,并且似乎与我读过的其他示例相矛盾。

4

1 回答 1

7

第一:在 () 中定义的 bean 不能访问在applicationContext.xml( ContextLoaderListener) 中spring-mvc-servlet.xml定义的bean,反之则不行DispatcherServlet

您询问:


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

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


我需要将我的从 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:interceptorsmvc:resources,,,,,,,,...mvc:default-servlet-handlermvc:view-controllerReloadableResourceBundleMessageSourceCookieLocaleResolver.SimpleMappingExceptionResolver

顺便说一句:如果您使用组件扫描,那么您需要其中两个,一个applicationContext.xml用于扫描@Service @Repository@Component(但不是@Controller),另一个 spring-mvc-context.xml仅用于扫描@Controller


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

于 2012-04-30T07:45:34.180 回答