Метод Spring Factory 'springSecurityFilterChain' org.apache.catalina.filters.RemoteIpFilter не имеет зарегистрированного заказа - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь заставить цепочку фильтров безопасности Spring работать с RemoteIpFilter.

Текущее сообщение об ошибке:

Failed to instantiate [javax.servlet.Filter]: Factory method'springSecurityFilterChain' threw exception; nested exception is java.lang.IllegalArgumentException: The Filter class 
org.apache.catalina.filters.RemoteIpFilter does not have a registered order and cannot be added without a specified order. Consider using addFilterBefore or addFilterAfter instead.

Если я удалю RemoteIpFilter, конфигурация будет работать отлично.

Не так много примеров RemoteIpFilter вне среды весенней загрузки.

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
private static final String X509_CERTIFICATE_NAME = "cert";
private static final Log logger = LogFactory.getLog(SpringSecurityConfig.class);

@Autowired
SecurityConfig securityConfig;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilter(preauthProcessingFilter())
        .csrf().disable() // there is a custom CSRF Filter
        .addFilter(remoteIpFilter())
        .authenticationProvider(preauthAuthProvider())
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .logout()
            .logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)))
            .and()
        .sessionManagement()
            .sessionAuthenticationFailureHandler(sessionAuthenticationFailureHandler())
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
            .sessionFixation().migrateSession()
            .maximumSessions(securityConfig.getMaximumSessionsPerUser())
            .maxSessionsPreventsLogin(true)
            ;
}

@Bean
public AbstractPreAuthenticatedProcessingFilter preauthProcessingFilter() throws Exception{
    RequestHeaderAuthenticationFilter filter = new RequestHeaderAuthenticationFilter();
    filter.setPrincipalRequestHeader(X509_CERTIFICATE_NAME);
    filter.setAuthenticationManager(authenticationManager());
    filter.setContinueFilterChainOnUnsuccessfulAuthentication(false);
    return filter;
}

@Bean
public RemoteIpFilter remoteIpFilter() {
    RemoteIpFilter filter = new RemoteIpFilter();
    return filter;
}

1 Ответ

0 голосов
/ 12 октября 2018

Я думаю, что исключение, которое вы получили, ясно говорит о том, что вы должны делать:
Consider using addFilterBefore or addFilterAfter instead.

Но сначала давайте возьмем lool в docs :
addFilter (javax.servlet.Filter filter) - добавляет фильтр, который должен быть экземпляром или расширять один из фильтров , предоставляемых в рамках структуры безопасности .

Ваш фильтр RemoteIpFilter не является фильтром, предоставляемым пружиной, потому что это из Apache.

У вас есть два подхода к решению:
1. Вы можете обернуть RemoteIpFilter с классом пружинного фильтра, как GenericFilterBean
2. Или вы можете использовать один изМетод thoose вместо addFilter(filter):
addFilterBefore(filter, class)
addFilterAfter(filter, class)
addFilterAt(filter, class)

Также взгляните на эту статью, это может быть полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...