2012-04-30 12 views
5

Estoy tratando de comprender la manera recomendada para definir Spring Security en aplicaciones Spring-MVC, donde las definiciones de beans se dividen en múltiples contextos padre/hijo.Spring Security + MVC: preguntas sobre la definición de contexto y el alcance de bean

Por ejemplo, de mi aplicación actual web.xml tiene el siguiente, (que yo entiendo que es bastante estándar)

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

Por lo tanto, tienen un estándar ContextLoaderListener definido en /, que carga mis configuraciones globales - applicationContext.xml y securityContext.xml. También defino la primavera mvc DispatcherServlet en /app/, que carga sus propios granos de spring-mvc-servlet.xml.

Según tengo entendido, la configuración definida en spring-mvc-servlet.xml no está visible para la configuración definida en ninguno de los archivos de contexto de nivel superior.

¿Cuál es, entonces, el mejor lugar para definir conceptos de seguridad a nivel de aplicación? Por ejemplo, me gustaría agregar el siguiente filtro.

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

Esto es por lo que solicita a /app/oauth/token pase a través de este filtro, y obtener la autenticación básica procesada.

Debido a que esto pertenece directamente a una preocupación de la aplicación Spring-MVC, inicialmente lo definí en spring-mvc-context.xml (razón por la cual el app está excluido de la url).

Sin embargo, esto significa que no es visible para la configuración de seguridad definida en securityContext.xml, por lo que se ignora.

Por lo tanto, lo muevo hasta securityContext.xml, pero al hacerlo, también debe mover todas las dependencias. Terminé rápidamente moviendo todo hasta applicationContext.xml, lo que deja el spring-mvc-context.xml casi vacío.

¿Es esto común? ¿Cuál es la división recomendada entre lo que se define en contextos de alto nivel y lo que se define en los contextos secundarios?

Dado que spring-mvc define una serie de controladores, que quiero marcar como @Secured, ¿cómo se procesarán si el controlador no es visible para el contexto de seguridad?

¿Debo mover mi <mvc:annotation-driven /> del servlet.xml al global applicationContext.xml? ¿Necesito configuración adicional dentro del spring-mvc-servlet.xml para decirle que participe en la seguridad de Spring?

He leído el documentation on Spring-MVC, pero hay muy pocos detalles sobre cómo configurar esto. Además, el Spring OAuth examples parece definir todo dentro de un solo archivo de configuración, que no parece muy real, y parece contradecir otros ejemplos que he leído.

Respuesta

7

Primera: los granos definidos dentro applicationContext.xml (ContextLoaderListener) no pueden acceder a la definida en spring-mvc-servlet.xml (DispatcherServlet), pero no a la inversa.

Se preguntó:


Dado que la primavera-MVC define una serie de controladores, que quiero marcar como @Secured, cómo serán procesadas si el controlador no es visible para la seguridad ¿contexto?

Así que esto funciona sin problemas, ya que los controladores deben ser definidos en el spring-mvc-servlet.xml, por lo que "ver" las cosas de la primavera de Seguridad define en applicationContext.xml


¿Necesito mover mi desde el servlet.xml al global applicationContext.xml?

Sin


¿Es necesario configuración adicional dentro de la primavera-mvc-servlet.xml para indicarle que debe participar en la seguridad de Primavera?

Sin


... que deja la primavera-mvc-context.xml casi vacío. ¿Es esto común?

El spring-mvc-context.xml debe contener todo lo que esté relacionado con Web Stuff (excepto por cuestiones de seguridad). Por lo que las partes comunes del spring-mvc-context.xml son exploración componente para @Controller, algunos interceptores (mvc:interceptors), mvc:resources, mvc:default-servlet-handler, mvc:view-controller, ReloadableResourceBundleMessageSource, CookieLocaleResolver, .SimpleMappingExceptionResolver ...

Por cierto: si utiliza exploración componente, entonces necesita dos de ellos, uno en applicationContext.xml para escanear @Service@Repository y @Component (pero no @Controller) y un segundo en spring-mvc-context.xml que solo escanea @Controller!


@see también esta pregunta: ¿Es ContextLoaderListener or not? discutir el tema desde otro punto de vista.

Cuestiones relacionadas