[英]Spring Security + MVC : Questions around context definition & bean scope
我试图理解在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
中定义的config对于任何一个顶级上下文文件中定义的配置都不可见。
哪里是定义应用级安全概念的最佳位置? 例如,我想添加以下过滤器。
<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安全性?
我已经阅读了关于Spring-MVC的文档 ,但是关于如何配置它的细节很少。 此外, Spring OAuth示例似乎在单个配置文件中定义了所有内容,这看起来并不真实,并且似乎与我读过的其他示例相矛盾。
首先: 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:resources
, mvc:default-servlet-handler
, mvc:view-controller
, ReloadableResourceBundleMessageSource
, CookieLocaleResolver
, .SimpleMappingExceptionResolver
......
顺便说一句:如果你使用组件扫描,那么你需要其中两个,一个在applicationContext.xml
上扫描@Service
@Repository
和@Component
(但不是@Controller
),另一个在spring-mvc-context.xml
中只扫描为@Controller
!
@See也有这个问题: ContextLoaderListener与否? 它从另一个角度讨论了这个主题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.