ho un bel noce di crack qui .. cercato di integrare detto 3 tecnologie nella nostra webapp .. Ci vogliono usareCombinando DispatcherServlet, ContextLoaderListener e SpringSecurity
- Web Primavera
- Spring MVC come vista la tecnologia (con freemarker)
- 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.
Mi puoi dire che cosa succede se si dà una richiesta ilike '/ test', sta andando alla controller o essere reindirizzato alla pagina di accesso? –
'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
Se si specifica un URL valido, qual è il valore risposta restituita? –