2013-06-04 23 views
7

Sto provando ad avere un contesto di sicurezza primaverile nel contesto figlio, quindi potrei avere la sicurezza dell'URL sul file di contesto del servlet.Come avere un contesto di sicurezza primaverile nel contesto figlio

ho:

<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> 

su web.xml, configurazione di sicurezza generale sulla primavera-security.xml e

<!-- 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"/> 

sul myapp-soap-servlet.xml. Non funziona, ma non riesce con

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 

Tuttavia, se mi trasferisco <security:http> parte di configurazione del contesto radice primavera-sicurezza, tutto funziona. Non dovrebbe funzionare nel modo in cui provo? Come posso ottenere la sicurezza basata su URL nel mio contesto figlio?

Ho anche provato a combinare i file di contesto in uno, ma lo stesso problema sembra verificarsi.

+0

Sei sicuro che la vostra primavera-security.xml viene prelevato dalla primavera? –

+0

@MaksymDemidas sì, poiché spostare la parte 'http' risulta in tutte le direttive utilizzate, sia nel contesto parnt che in quello secondario – eis

risposta

17

Il DelegatingFilterProxy sarà dallo sguardo default nel ApplicationContext radice che significa che di default è necessario inserire la configurazione <http> lì (è ciò che crea lo springSecurityFilterChain).

Tuttavia, è possibile specificare che DelegatingFilterProxy un diverso ApplicationContext specificando il contextAttribute per l'utilizzo. Per fare questo aggiornamento tuo web.xml come mostrato di seguito

<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> 

Un esempio simile utilizzando Primavera di sicurezza 3.2 s '+ AbstractSecurityWebApplicationInitializer può essere visto sotto:

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"; 
    } 

} 

Questo funziona perché modifica il nome del L'attributo ServletContext che DelegatingFilterProxy utilizza per cercare ApplicationContext. Invece di utilizzare il valore predefinito che rileva la radice ApplicationContext, ora utilizza l'attributo che il tuo MessageDispatcherServlet utilizza (indicando quindi il contesto figlio).

noti che MessageDispatcherServlet 's (o qualsiasi sottoclasse di FrameworkServlet come DispatcherServlet) memorizza il ApplicationContext nel ServletContext utilizzando il nome dell'attributo "org.springframework.web.servlet.FrameworkServlet.CONTEXT." + <servlet-name> dove <servlet-name> è il nome del servlet. Pertanto, in questo caso, l'attributo che deve essere configurato è org.springframework.web.servlet.FrameworkServlet.CONTEXT.myapp-soap. Se hai cambiato il nome servlet from myapp-soap a spring-servlet, allora dovresti usare org.springframework.web.servlet.FrameworkServlet.CONTEXT.spring-servlet.

PS Credo che il soggetto deve leggere "Come avere contesto di sicurezza a molla come contesto bambino"

+0

wow, suona esattamente ciò di cui ho bisogno. Ci proverò e tornerò con i risultati. – eis

+0

funziona come un fascino. – eis

2

<security:http> dovrà andare al contesto di applicazione principale invece del contesto bambino (servlet), perché questo elemento dello spazio dei nomi di sicurezza crea il springSecurityFilterChain di fagioli, che si alzò dal DelegatingFilterProxy nel contesto principale. Come javadoc chiaramente:

web.xml di solito contengono una definizione DelegatingFilterProxy, con la specificata filter-name corrispondente a un nome fagiolo in contesto applicativo radice Spring.

Problemi correlati