【问题标题】:Spring Security + MVC : Questions around context definition & bean scopeSpring Security + MVC:关于上下文定义和 bean 范围的问题
【发布时间】: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.xmlsecurityContext.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,如果控制器对安全上下文不可见,将如何处理这些控制器?

我是否需要将我的&lt;mvc:annotation-driven /&gt;servlet.xml 移动到全局applicationContext.xml? 我是否需要在spring-mvc-servlet.xml 中进行额外配置才能告诉它参与 Spring 安全性?

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

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    首先:applicationContext.xml (ContextLoaderListener) 中定义的bean 不能访问spring-mvc-servlet.xml (DispatcherServlet) 中定义的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-controllerReloadableResourceBundleMessageSourceCookieLocaleResolver.SimpleMappingExceptionResolver.. .

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 2013-03-03
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多