2012-06-11 1 views
5

ho un bel noce di crack qui .. cercato di integrare detto 3 tecnologie nella nostra webapp .. Ci vogliono usareCombinando DispatcherServlet, ContextLoaderListener e SpringSecurity

  1. Web Primavera
  2. Spring MVC come vista la tecnologia (con freemarker)
  3. Primavera di sicurezza come strato di sicurezza

Ma in qualunque modo io configurare il mio altre file di contesto web.xml e non riesco a ottenere tutto per lavorare allo stesso tempo .. con il mio attuale configurazione funzionerà tutto, tranne SpringSecurity non intercettare i modelli di URL

Alcuni googling (e comuni di senso) mi ha detto che la combinazione di DispatcherServlet e ContextLoaderListener potrebbe essere un problema.

Quindi, ecco le mie configurazioni. (Ci scusiamo per così tanto di testo e grazie per la lettura):

web.xml:

<!-- Needed by Spring --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/dw-manager-context.xml</param-value> 
</context-param> 

<!-- Needed by Spring MVC --> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<!-- Needed by Spring Security --> 
<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> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

mio servlet-context.xml:

<!-- Scan for controllers --> 
<context:component-scan base-package="dw.manager" /> 

<!-- Need to declare annotation driven transactions again so they are picked up above controller methods --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

<mvc:annotation-driven /> 

<bean id="viewResolver"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    <!-- ... --> 
</bean> 

<bean id="freemarkerConfig" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <!-- ... --> 
</bean> 

Il mio manager-context.xml:

<context:annotation-config /> 

    <!-- deployment-setup just loads properties (files) --> 
<import resource="deployment-setup.xml" /> 
<import resource="spring-security-context.xml" /> 
<import resource="dw-manager-datasource.xml" /> 

<!-- Import sub-modules --> 
<import resource="classpath:dw-security-context.xml" /> 
<!-- ... --> 

Primavera-Security-context.xml:

<http pattern="/login" security="none" /> 
<http pattern="/accessDenied" security="none" /> 
<http pattern="/" security="none" /> 

<!-- enable use of expressions, define URL patterns and login/logout forms 
    and targets) --> 
<http use-expressions="true" access-denied-page="/accessDenied"> 
    <intercept-url pattern="/*" access="hasRole('ROLE_USER')" /> 
    <!-- more stuff --> 
</http> 

<!-- a lot more... --> 

manager-datasource solo imposta il database ...


Grazie per la lettura di tutto e, auspicabilmente, aiutare me ..;)


edit: qualche info in più

Non riesco a saltare il ContextLoaderListener, è richiesto da SpringSecurity. Inoltre, non posso saltare contextConfigLocation poiché questo è il contesto richiesto da ContextLoaderListener. Definisco solo il nome, altrimenti cercherà un'applicazione applicationContext.xml. Forse posso aggiungere un contextConfigLocation vuoto? Ma questo probabilmente significa solo che i moduli sottostanti non troveranno i loro fagioli da iniettare ..?


edit2

Credo che il problema principale è che ha bisogno di un contesto SpringSecurity webapp (ContextLoaderListener) per lavorare, ma l'applicazione Web è in esecuzione all'interno del contesto servlet. I metodi del controller vengono mappati dal contesto servlet e quindi la sicurezza viene eseguita "all'esterno", il contesto servlet non viene notificato dall'evento e il filtro non esegue il kicking.

+0

Mi puoi dire che cosa succede se si dà una richiesta ilike '/ test', sta andando alla controller o essere reindirizzato alla pagina di accesso? –

+0

'2012/06/11 15:31:23 PageNotFound [WARN] Nessun mapping trovato per richiesta HTTP con URI [/ dw-manager/test] in DispatcherServlet con nome 'appServlet'' – Pete

+0

Se si specifica un URL valido, qual è il valore risposta restituita? –

risposta

0

Sigh .. Non so perché non ha funzionato la prima volta, probabilmente la soluzione sbagliata era nella cache mentre si cercava quella corretta. Tuttavia ora funziona proprio come ho postato io. Grazie Arun per il tuo tempo.

unico problema ora: primavera-test-MVC non supporta FilterChain di Primavera di sicurezza ma questa è un'altra questione ..