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

Mar*_*itt 5 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>
Run Code Online (Sandbox Code Playgroud)

所以,我有一个标准ContextLoaderListener定义/,加载我的全局配置 - applicationContext.xmlsecurityContext.xml.我还定义了spring mvc DispatcherServletat /app/,它从中加载了自己的bean 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>
Run Code Online (Sandbox Code Playgroud)

这样,请求/app/oauth/token通过此过滤器,并获得处理的基本身份验证.

因为这与Spring-MVC app的关注直接相关,所以我最初定义它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安全性?

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

Ral*_*lph 7

首先:中定义的豆applicationContext.xml(ContextLoaderListener)不能访问定义的spring-mvc-servlet.xml(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应包含每一个有关的网络服务(除secrutiy)的事情.所以的公用部分spring-mvc-context.xml是组件扫描@Controller,一些拦截器(mvc:interceptors), ,mvc:resources,mvc:default-servlet-handler,mvc:view-controller,,ReloadableResourceBundleMessageSource ...CookieLocaleResolver.SimpleMappingExceptionResolver

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


@See也有这个问题:ContextLoaderListener与否?它从另一个角度讨论了这个主题.