2012-04-30 8 views
5

Bean定義が複数の親子コンテキストに分割されたSpring-MVCアプリケーションでSpring Securityを定義するための推奨方法を理解しようとしています。Spring Security + MVC:コンテキスト定義と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> 

だから、私は私の世界のconfigsをロードする、/で定義された標準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としてマークしたい場合、コントローラがセキュリティコンテキストに表示されていない場合、これらはどのように処理されますか?

<mvc:annotation-driven />servlet.xmlからグローバルapplicationContext.xmlに移動する必要がありますか? spring-mvc-servlet.xmlの中で、Springセキュリティに参加するよう追加の設定が必要ですか?

私はdocumentation on Spring-MVCを読んだことがありますが、これを構成する方法は非常に少ないです。 さらに、Spring OAuth examplesは、単一の設定ファイル内にすべてを定義しているように見えますが、現実的ではないようで、私が読んだ他の例と矛盾しているようです。

答えて

7

まず:applicationContext.xmlContextLoaderListener)内で定義された豆はspring-mvc-servlet.xmlDispatcherServlet)で定義されていないが、他の方法で回避にアクセスすることはできません。

あなたが尋ねた:春-MVCコントローラは、セキュリティに表示されていない場合は、これらを処理する方法を、私は@Securedとしてマークするコントローラのシリーズを定義することを考えると


をコンテキスト?

ので、コントローラはspring-mvc-servlet.xmlで定義されなければならないので、これは、問題なく動作しますので、彼らはapplicationContext.xml


で定義された春のセキュリティのものを「見る」私はから私を移動する必要がありますかグローバルapplicationContext.xmlへのservlet.xml?


私は春のセキュリティに参加することを伝えるために、スプリングMVC-servlet.xmlの中に追加の設定が必要ですか?ほとんど空春-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 ...ところで

です:あなたはコンポーネントのスキャンを使用する場合は、2を必要としますで@Service@Repository@Component(ただし、@Controllerではない)とspring-mvc-context.xmlの2番目のスキャンでは、@Controller!のスキャンのみが行われます。


@seeもこの質問:ContextLoaderListener or not?それは、ビューの他の点からテーマを議論します。