我试图理解在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 .
据我了解,_2797657中定义的配置对于任何一个顶级上下文文件中定义的配置都不可见 .
哪里是定义应用级安全概念的最佳位置?例如,我想添加以下过滤器 .
<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似乎在单个配置文件中定义了所有内容,而这些内容并未读取 .
1 回答
首先:在
applicationContext.xml
(ContextLoaderListener
)中定义的bean无法访问spring-mvc-servlet.xml
(DispatcherServlet
)中定义的bean,但不能相反 .您询问:
所以这没有问题,因为控制器必须在
spring-mvc-servlet.xml
中定义,所以他们"see"在applicationContext.xml
中定义的Spring Security内容没有
没有
spring-mvc-context.xml
应该包含与Web Stuff相关的所有内容(secrutiy除外) . 所以spring-mvc-context.xml
的公共部分是@Controller
的组件扫描,一些拦截器(mvc:interceptors
),_ 277685,mvc:default-servlet-handler
,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _顺便说一句:如果您使用组件扫描,那么您需要其中两个,一个在
applicationContext.xml
扫描@Service
@Repository
和@Component
(但不是@Controller
),而在spring-mvc-context.xml
中只扫描一个@Controller
!@See也是这个问题:ContextLoaderListener or not?它从另一个角度讨论主题 .