Я пытаюсь понять рекомендуемый способ определения Spring Security в приложениях Spring-MVC, где определения компонентов разбиваются на несколько контекстов родителя/ребенка.Spring Security + MVC: вопросы вокруг определения контекста и области bean
Например, мои текущие приложения web.xml
выглядит следующим образом, (я понимаю, довольно стандартный)
<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>
Итак, у меня есть стандартный ContextLoaderListener
определенного в /
, который загружает мои глобальные конфиги - applicationContext.xml
и securityContext.xml
. Я также определяю весенний mvc DispatcherServlet
по адресу /app/
, который загружает собственные бобы от spring-mvc-servlet.xml
.
Как я понимаю, конфигурация, определенная в spring-mvc-servlet.xml
, не отображается в конфигурации, определенной в любом из файлов контекста верхнего уровня.
Где же самое лучшее место для определения концепций безопасности на уровне приложений? Например, я хотел бы добавить следующий фильтр.
<security:http pattern="/oauth/token" create-session="stateless" entry-point-ref="oauthAuthenticationEntryPoint">
<security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
</security:http>
Это объясняется тем, что просит /app/oauth/token
проход через этот фильтр, и получить базовую аутентификацию обрабатывается.
Поскольку это относится непосредственно к проблеме приложения Spring-MVC, я изначально определил его в spring-mvc-context.xml
(вот почему app
исключен из URL-адреса).
Однако это означает, что он не отображается в конфигурации безопасности, определенной в securityContext.xml
, поэтому он игнорируется.
Итак, я перемещаю его до securityContext.xml
, но при этом также необходимо переместить все зависимости. Я быстро в конечном итоге перемещаю все до applicationContext.xml
, что оставляет почти пустым.
Это обычное явление? Что такое рекомендуемое разделение между тем, что определено в контекстах верхнего уровня, и тем, что определяется в детском контексте?
Учитывая, что spring-mvc определяет серию контроллеров, которые я хочу отметить как @Secured
, как они будут обрабатываться, если контроллер не будет виден контексту безопасности?
Нужно ли мне переместить <mvc:annotation-driven />
из servlet.xml
в глобальный applicationContext.xml
? Нужна ли мне дополнительная конфигурация в пределах spring-mvc-servlet.xml
, чтобы сообщить об этом для участия в весенней безопасности?
Я читал documentation on Spring-MVC, но очень мало деталей о том, как его настроить. Кроме того, Spring OAuth examples, похоже, определяет все в одном файле конфигурации, который не кажется очень реальным, и, похоже, противоречит другим примерам, которые я прочитал.