2012-06-11 10 views
5

tengo bastante una tuerca de roer aquí .. He estado tratando de integrar dicho 3 tecnologías en nuestra aplicación web .. Nos quieren utilizarDispatcherServlet, ContextLoaderListener y SpringSecurity

  1. Spring Web
  2. Spring MVC como vista tecnología (con FreeMarker)
  3. Spring Security como capa de seguridad

Pero de cualquier manera puedo configurar mi web.xml y otros archivos de contexto no puedo conseguir que todo funcione a la vez .. Con todo mi configuración actual funcionará, excepto SpringSecurity no interceptará los patrones de URL

algunas google (y de sentido Comunes) me dijo que la combinación de DispatcherServlet y ContextLoaderListener podría ser un problema.

Así que aquí están mis configuraciones. (Lo siento por tanto texto y gracias por leer):

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> 

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

Mi 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-Seguridad-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... --> 

gerente-fuente de datos simplemente configura la base de datos ...


Gracias por leer de todo y espero ayudar a mi ..;)


edición: algo más de información

No puedo omitir el ContextLoaderListener, es requerido por SpringSecurity. Tampoco puedo omitir contextConfigLocation ya que este es el contexto requerido por ContextLoaderListener. Solo defino el nombre yo mismo, buscará un applicationContext.xml. Tal vez puedo agregar un contexto vacíoConfigLocation? Pero eso probablemente solo signifique que los módulos subyacentes no encontrarán sus beans para inyectar ...?


Edit2

Creo que el problema principal es que SpringSecurity necesita un contexto de aplicación web (ContextLoaderListener) para trabajar, pero la aplicación web se ejecuta dentro del contexto del servlet. Los métodos del controlador se asignan por el contexto del servlet y, por lo tanto, la seguridad de primavera que se ejecuta "fuera" del contexto del servlet no recibe notificación del evento y el filtro no entra en acción ..

+0

¿Me puede decir lo que sucede si se le da un iLike solicitud '/ test', es que va a la controlador o ser redirigido a la página de inicio de sesión? –

+0

'2012-06-11 15:31:23 PageNotFound [WARN] No se encontró una asignación para la solicitud HTTP con URI [/ dw-manager/test] en DispatcherServlet con el nombre 'appServlet'' – Pete

+0

Si proporciona una URL válida, ¿cuál es la respuesta devuelta? –

Respuesta

0

Suspiro ... No sé por qué no funcionó la primera vez, probablemente la solución incorrecta estaba en el caché mientras intentaba la correcta ... Sin embargo, ahora está funcionando tal como lo publiqué. Gracias a Arun por tu tiempo.

El único problema ahora: la prueba de primavera-mvc no soporta FilterChain de primavera de Seguridad, pero esa es otra pregunta ..

Cuestiones relacionadas