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.