2013-06-04 16 views
7

Próbuję mieć kontekst ochrony wiosennej w kontekście podrzędnym, więc mógłbym mieć zabezpieczenia URL w pliku kontekstowym serwletu.Jak mieć kontekst ochrony w kontekście dziecięcym

mam:

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

na web.xml, ogólną konfigurację zabezpieczeń sprężynowy security.xml i

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

na myapp-mydła servlet.xml. To nie działa, ale nie działa z

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 

Jednakże, jeśli przeniosę <security:http> część do konfiguracji kontekstowego korzeni wiosna-security, wszystko działa. Czy nie powinno to działać tak, jak próbuję? Jak mogę uzyskać zabezpieczenia oparte na url w kontekście mojego dziecka?

Próbowałem również połączyć pliki kontekstowe w jeden, ale ten sam problem wydaje się występować.

+0

jesteś pewien, że twój wiosna-security.xml jest odbierany przez wiosnę? –

+0

@MaksymDemidas tak, ponieważ przeniesienie części 'http' powoduje zastosowanie wszystkich dyrektyw, zarówno w kontekście parnt, jak i podrzędnym – eis

Odpowiedz

17

DelegatingFilterProxy będzie domyślnie spojrzeć w ApplicationContext korzeni czyli domyślnie należy umieścić tam swoją konfigurację <http> (to jest to, co tworzy springSecurityFilterChain).

Można jednak określić, że należy użyć innego DelegatingFilterProxy innego , określając jego atrybut contextAttribute. Aby to zrobić należy zaktualizować swój web.xml jak pokazano poniżej

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

Podobny przykład stosując Wiosna Zabezpieczenia 3,2 + 's AbstractSecurityWebApplicationInitializer można zobaczyć poniżej:

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

} 

To działa, ponieważ modyfikuje nazwę Atrybut ServletContext używany przez DelegatingFilterProxy do wyszukiwania ApplicationContext. Zamiast używać domyślnej wartości, która odkrywa root ApplicationContext, teraz używa on atrybutu, który używa twój MessageDispatcherServlet (wskazując w ten sposób na kontekst podrzędny).

Zauważ, że MessageDispatcherServlet „s (lub dowolnej podklasy FrameworkServlet takich jak DispatcherServlet) przechowuje ApplicationContext w ServletContext używając nazwy atrybutu "org.springframework.web.servlet.FrameworkServlet.CONTEXT." + <servlet-name> gdzie <servlet-name> jest nazwą serwletu. W tym przypadku atrybut, który należy skonfigurować, to org.springframework.web.servlet.FrameworkServlet.CONTEXT.myapp-soap. Jeśli zmieniono nazwę serwletu na from myapp-soap na spring-servlet, należy zamiast tego użyć org.springframework.web.servlet.FrameworkServlet.CONTEXT.spring-servlet.

PS Myślę przedmiot powinien przeczytać „Jak sprężynowo kontekst zabezpieczeń jako kontekst dziecka”

+0

Wow, brzmi dokładnie to, czego potrzebuję. Spróbuję tego i wrócę z wynikami. – eis

+0

działa jak urok. – eis

2

<security:http> będzie musiał przejść do głównego kontekstu aplikacji zamiast na dziecko (aplet) kontekście, ponieważ ten element nazw bezpieczeństwo tworzy springSecurityFilterChain fasoli, która jest sprawdzana przez DelegatingFilterProxy w głównym kontekście. Jak sama javadoc wyraźnie stwierdza:

web.xml zazwyczaj zawierają DelegatingFilterProxy definicję, z określonym filter-name odpowiadającą nazwą fasoli wiosną za głównego kontekstu aplikacji.

Powiązane problemy