2012-04-30 14 views
5

Sto cercando di capire il modo consigliato per definire Spring Security nelle applicazioni Spring-MVC, in cui le definizioni bean sono suddivise tra più contesti padre/figlio.Spring Security + MVC: domande relative alla definizione del contesto e all'ambito dei bean

Per esempio, il mio attuale dell'applicazione web.xml appare come segue, (che ho capito di essere abbastanza standard)

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

Così, ho uno standard ContextLoaderListener definita a /, che carica i miei file di configurazione globali - applicationContext.xml e securityContext.xml. Definisco anche la molla mvc DispatcherServlet a /app/, che carica i propri bean da spring-mvc-servlet.xml.

A quanto ho capito, la configurazione definita in spring-mvc-servlet.xml non è visibile per la configurazione definita in nessuno dei file di contesto di livello superiore.

Dove si trova il posto migliore per definire i concetti di sicurezza a livello di app? Ad esempio, vorrei aggiungere il seguente filtro.

<security:http pattern="/oauth/token" create-session="stateless" entry-point-ref="oauthAuthenticationEntryPoint"> 
    <security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" /> 
</security:http> 

Questo è così che chiede di /app/oauth/token passare attraverso questo filtro, e vengono elaborati autenticazione di base.

Poiché ciò si riferisce direttamente a un problema dell'app Spring-MVC, inizialmente l'ho definito in spring-mvc-context.xml (motivo per cui l'app è escluso dall'URL).

Tuttavia, ciò significa che non è visibile alla configurazione di sicurezza definita in securityContext.xml, quindi viene ignorata.

Quindi, lo sposto fino a securityContext.xml, ma nel fare ciò, deve anche spostare tutte le dipendenze. Finisco rapidamente a spostare tutto fino a applicationContext.xml, che lascia lo spring-mvc-context.xml quasi vuoto.

È comune? Qual è la divisione consigliata tra ciò che viene definito nei contesti di primo livello e ciò che viene definito nei contesti figlio?

Dato che spring-mvc definisce una serie di controller, che desidero contrassegnare come @Secured, come verranno elaborati se il controller non è visibile nel contesto di sicurezza?

Devo spostare il mio <mvc:annotation-driven /> da servlet.xml a quello globale applicationContext.xml? Ho bisogno di una configurazione aggiuntiva all'interno dello spring-mvc-servlet.xml per dirgli di partecipare alla sicurezza di Spring?

Ho letto il documentation on Spring-MVC, ma ci sono pochissime specifiche su come configurarlo. Inoltre, lo Spring OAuth examples sembra definire tutto all'interno di un singolo file di configurazione, che non sembra molto realistico, e sembra contraddire altri esempi che ho letto.

risposta

7

Primo: i fagioli definiti all'interno applicationContext.xml (ContextLoaderListener) non può accedere a quello definito in spring-mvc-servlet.xml (DispatcherServlet), ma non il contrario.

ti ha chiesto:


Dato che la primavera-MVC definisce una serie di controllori, che voglio contrassegnare come @Secured, come saranno trattati se il controller non è visibile per la sicurezza contesto?

Quindi questo funziona senza problemi, perché i controllori devono essere definiti nel spring-mvc-servlet.xml, in modo che "vedono" la roba Primavera di sicurezza definito nel applicationContext.xml


Devo spostare il mio da il servlet.xml al file applicationContext.xml globale?

No


ho bisogno di un'ulteriore configurazione all'interno della primavera-MVC-servlet.xml per dirgli di partecipare sicurezza primavera?

No


... che lascia la molla-MVC-context.xml quasi vuoto. È comune?

Il spring-mvc-context.xml deve contenere tutto ciò che è correlato a Web Stuff (eccetto secrutiy). Così le parti comuni del spring-mvc-context.xml sono scansione componenti per @Controller, alcuni intercettori (mvc:interceptors), mvc:resources, mvc:default-servlet-handler, mvc:view-controller, ReloadableResourceBundleMessageSource, CookieLocaleResolver, .SimpleMappingExceptionResolver ...

BTW: se si utilizza la scansione dei componenti, allora avete bisogno di due di loro, uno a applicationContext.xml per la scansione di @Service@Repository e @Component (ma non @Controller) e un secondo in spring-mvc-context.xml che ricerca solo per @Controller!


@see anche questa domanda: E 'ContextLoaderListener or not? discutere il tema da un altro punto di vista.

Problemi correlati