2013-06-04 17 views
7

子コンテキストで春のセキュリティコンテキストを使用しようとしているため、サーブレットコンテキストファイルでセキュリティを確保できます。子コンテキストで春のセキュリティコンテキストを取得する方法

は私が持っている:春のsecurity.xmlのweb.xmlの、一般的なセキュリティ設定の

<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> 
    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     classpath:/spring-security.xml 
    </param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
    <servlet-name>myapp-soap</servlet-name> 
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>transformWsdlLocations</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    </servlet> 

とmyappの石鹸-servlet.xmlに

<!-- Authorization configurations --> 
<security:http auto-config="false" use-expressions="true" 
    create-session="never" 
    authentication-manager-ref="authenticationManager" 
    entry-point-ref="authenticationEntryPoint"> 

    <security:custom-filter 
     position="PRE_AUTH_FILTER" ref="serviceAuthenticationFilter"/> 

    <security:intercept-url 
     pattern="/GetForbiddenUrl" access="hasRole('roleThatDoesntExist')" /> 
    <security:intercept-url pattern="/**" access="permitAll" /> 
</security:http> 
<!-- annotation security --> 
<security:global-method-security pre-post-annotations="enabled"/> 

。私は春・セキュリティルートコンテキストのコンフィギュレーションは、すべての作品に <security:http>一部を移動する場合は、動作しますが、しかし

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/my-app/v1/soap]] (ServerService Thread Pool -- 192) JBWEB000284: Exception starting filter springSecurityFilterChain: 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined 

で失敗しません。私が試したように動作してはいけませんか?私の子のコンテキストでURLベースのセキュリティを取得するにはどうすればよいですか?

また、コンテキストファイルを1つに結合しようとしましたが、同じ問題が発生するようです。

+0

「子コンテキストとして春のセキュリティコンテキストを持つことがどのように」読むべきだと思う

PSは、あなたの春-のsecurity.xmlは、スプリングによってピックアップされていることを確認していますか? –

+0

@MaksymDemidasはい、 'http'部分を動かすと、parntと子の両方のコンテキストですべての指令が使用されてしまいます。 – eis

答えて

17

DelegatingFilterProxyます。

ただし、使用するcontextAttributeを指定することによってDelegatingFilterProxyと異なるApplicationContextを使用するように指定できます。春のセキュリティを使用して

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
     <param-name>contextAttribute</param-name> 
     <param-value>org.springframework.web.servlet.FrameworkServlet.CONTEXT.myapp-soap</param-value> 
    </init-param> 
</filter> 

同様の例の下に示したように、このアップデートをあなたのweb.xmlを行うには3.2 +さんAbstractSecurityWebApplicationInitializerは以下見ることができます:それはの名前を変更するため

public class SecurityApplicationInitializer extends 
     AbstractSecurityWebApplicationInitializer { 

    @Override 
    protected String getDispatcherWebApplicationContextSuffix() { 
     // NOTE: if you are using AbstractDispatcherServletInitializer or 
     // AbstractAnnotationConfigDispatcherServletInitializer You probably 
     // want this value to be "dispatcher" 
     return "myapp-soap"; 
    } 

} 

これは動作しますDelegatingFilterProxyApplicationContextを検索するために使用するServletContext属性。ルートApplicationContextを検出するデフォルト値を使用する代わりに、MessageDispatcherServletが使用している属性を使用するようになりました(したがって、子コンテキストを指しています)。

MessageDispatcherServlet年代(又はDispatcherServletなどFrameworkServletの任意のサブクラス)すなわち<servlet-name>サーブレットの名前である属性名"org.springframework.web.servlet.FrameworkServlet.CONTEXT." + <servlet-name>を用いServletContextApplicationContextを格納します。この場合、構成する必要がある属性はorg.springframework.web.servlet.FrameworkServlet.CONTEXT.myapp-soapです。サーブレット名from myapp-soapspring-servletに変更した場合は、代わりにorg.springframework.web.servlet.FrameworkServlet.CONTEXT.spring-servletを使用します。私は、被験者が

+0

うわー、私は必要なものを正確に聞きます。私はこれを試し、結果を返す。 – eis

+0

は魅力的です。 – eis

2

<security:http>は、このセキュリティ名前空間要素がメインコンテキストでDelegatingFilterProxyによって参照されるspringSecurityFilterChain beanを作成するため、子(サーブレット)コンテキストの代わりにメインアプリケーションコンテキストに移動する必要があります。そのjavadocが明確に述べたよう:

web.xmlファイルは通常、春のルートアプリケーションコンテキストにBean名に対応する指定filter-nameDelegatingFilterProxy定義を、含まれています。あなたは(それがspringSecurityFilterChainを作成するものである)が、あなたの<http>設定を配置する必要があり、デフォルトでは意味のルートのApplicationContextのデフォルトの外観によって