Как заказать несколько <http> элементов в Spring Безопасность, распределенную по нескольким файлам

В Spring безопасности можно указать несколько конфигураций , которые приводят к нескольким SecurityFilterChains. Я использую эту функцию для защиты API Rest, отличного от обычного веб-приложения. Оба, веб-приложения и остальные api разрабатываются в разных модулях (артефакты maven). Конфигурации Spring собираются с помощью шаблона подстановочного знака по всему пути класса (classpath*:/some-common-config-path/*.xml).

Security-Config для веб-приложения в web-security-config.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://cxf.apache.org/configuration/beans http://cxf.apache.org/schemas/configuration/cxf-beans.xsd
 http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
 <!-- Security Config for web app -->
 <http use-expressions="true" auto-config="false" entry-point-ref="loginEntryPoint">
 ...
 </http>
 <!-- Security Config for static resources -->
 <http pattern="/static/**" security="none">
 ...
</http></beans:beans>

Security-Config для API Rest в api-security-config.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://cxf.apache.org/configuration/beans http://cxf.apache.org/schemas/configuration/cxf-beans.xsd
 http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
 <http pattern="/api/**" use-expressions="true" create-session="stateless" authentication-manager-ref="apiAuthManager" entry-point-ref="restAuthenticationEntryPoint">
 <intercept-url pattern="/api/**" access="hasRole('REST_API')">
 <http-basic>
 </http-basic></intercept-url></http>
 ...
</beans:beans>

Проблема заключается в том, что порядок обоих модулей в пути к классам непредсказуем, а также порядок разбора конфигурационных файлов. В моем конкретном случае api-security-config.xml считывается после web-security-config.xml, и запуск контекста приложения прерывается со следующим исключением:

java.lang.IllegalArgumentException: универсальный шаблон соответствия ('/**') определяется перед другими шаблонами в цепочке фильтров, заставляя их игнорировать. Пожалуйста, проверьте порядок в пространстве имен или конфигурации FilterChainProxy bean

Итак, что бы я сделал, так или иначе укажите порядок элементов , так что конкретные конфиги анализируются до самого универсального. Есть ли возможность сделать это?

1 ответ

В настоящее время нет возможности разбить Spring конфигурацию безопасности XML и указать порядок, достаточный для того, чтобы ваш XML был загружен в правильном порядке. Одним из способов достижения этого было бы сделать следующее:

Создайте конфигурацию /some -common-config-path/security.xml, загружаемую общей конфигурацией, которая импортирует две конфигурации (которые не входят в общую конфигурационную папку) в правильном порядке:

Это можно сделать в Spring Security 3.2 с конфигурацией Java и с помощью аннотации @Order. Как показано в документации:

@Configuration
@EnableWebSecurity
public class MultiHttpSecurityConfig {
 @Autowired
 public void configureGlobal(AuthenticationManagerBuilder auth) { 
 auth
 .inMemoryAuthentication()
 .withUser("user").password("password").roles("USER");
 }
 @Configuration
 @Order(1) 
 public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
 protected void configure(HttpSecurity http) throws Exception {
 http
 .antMatcher("/api/**") 
 .authorizeRequests()
 .anyRequest().hasRole("ADMIN")
 .and()
 .httpBasic();
 }
 }
 @Configuration 
 public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http
 .authorizeRequests()
 .anyRequest().authenticated()
 .and()
 .formLogin();
 }
 }
}

Вы также можете разбить эти конфигурации, если вы этого захотите.

Чтобы автоматически выбрать конфигурацию Java, вы можете легко добавить сканирование классов к своей настройке. Например, если вы используете XML-ориентированную конфигурацию, и вся ваша конфигурация Java находится в пакете com.example.config, вы можете добавить:

Подробнее о конфигурации XML и Java читайте в разделе Конфигурация Java и XML из справки.

licensed under cc by-sa 3.0 with attribution.