【发布时间】:2012-04-30 15:50:57
【问题描述】:
我试图了解在 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.xml 和securityContext.xml。
我还在/app/ 处定义了spring mvc DispatcherServlet,它从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 被排除在 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 似乎在单个配置文件中定义了所有内容,这似乎不太真实,并且似乎与我读过的其他示例相矛盾。
【问题讨论】:
标签: java spring spring-mvc spring-security