2012-04-30 3 views
5

Я пытаюсь понять рекомендуемый способ определения 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, похоже, определяет все в одном файле конфигурации, который не кажется очень реальным, и, похоже, противоречит другим примерам, которые я прочитал.

ответ

7

Во-первых: бобы, определенные в applicationContext.xml (ContextLoaderListener) не может получить доступ к одной определенной в spring-mvc-servlet.xml (DispatcherServlet), но не наоборот.

Вы спросили:


Учитывая, что весна-MVC определяет ряд контроллеров, которые я хочу, чтобы пометить как @Secured, как эти параметры будут обработаны, если контроллер не виден безопасности контекст?

Так это работает без проблем, так как контроллеры должны быть определены в spring-mvc-servlet.xml, так что они «видят» материал Spring Security определено в applicationContext.xml


мне нужно пошевелить от делать servlet.xml для глобального applicationContext.xml?

Нет


мне нужна дополнительная конфигурация в пружине MVC-servlet.xml сказать ему, чтобы участвовать в Спринг безопасности не делать? не

Нет


... который оставляет пружинный MVC-context.xml почти пустой. Это распространено?

spring-mvc-context.xml должен содержать все, что связано с веб-материалами (кроме secrutiy). Таким образом, общие части spring-mvc-context.xml являются компонент сканирования @Controller, некоторые перехватчики (mvc:interceptors), mvc:resources, mvc:default-servlet-handler, mvc:view-controller, ReloadableResourceBundleMessageSource, CookieLocaleResolver, .SimpleMappingExceptionResolver ...

КСТАТИ: Если вы используете компонент сканирования, то вам нужно два из них один на applicationContext.xml для сканирования @Service@Repository и @Component (но не @Controller), а второй в spring-mvc-context.xml, который сканирует только @Controller!


@see также этот вопрос: ContextLoaderListener or not? Это обсуждение темы из другой точки зрения.

Смежные вопросы