春季安全webSecurity.ignoring()

use*_*509 5 spring-mvc spring-security spring-rest

我正在通过Spring Boot使用Spring Security。我有两种休息服务。

public / **->每个人都可以访问和使用这些服务

安全/ **->仅经过身份验证的用户可以使用。

@Slf4j
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity webSecurity) throws Exception {
    webSecurity.ignoring().antMatchers("/public/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.addFilterBefore(requestHeaderAuthenticationFilter(authenticationManager()),
            BasicAuthenticationFilter.class)
            .authorizeRequests().antMatchers("/secure/**").fullyAuthenticated();
}

@Bean
public RequestHeaderAuthenticationFilter requestHeaderAuthenticationFilter(
        final AuthenticationManager authenticationManager) {

    RequestHeaderAuthenticationFilter filter = new RequestHeaderAuthenticationFilter();
    filter.setAuthenticationManager(authenticationManager);
    filter.setExceptionIfHeaderMissing(true);
    filter.setPrincipalRequestHeader("MY_HEADER");
    filter.setInvalidateSessionOnPrincipalChange(true);
    filter.setCheckForPrincipalChanges(false);
    filter.setContinueFilterChainOnUnsuccessfulAuthentication(false);
    return filter;
}
Run Code Online (Sandbox Code Playgroud)

当我想在公共场所访问资源时,我遇到了例外。

异常:“ org.springframework.security.web.authentication.preauth.PreAuthenticatedCredentialsNotFoundException”

消息:“在请求中找不到MY_HEADER标头。”

为什么将过滤器配置为忽略资源时在公共资源下将其激活?

谢谢提前

sha*_*zin 2

这是Spring Security Github使用 Bean 作为过滤器时WebSecurity.ignoring()讨论的一个问题。

@Bean您可以通过删除Filter 声明中的注释来解决此问题。

// @Bean - Remove or Comment this
public RequestHeaderAuthenticationFilter requestHeaderAuthenticationFilter(
        final AuthenticationManager authenticationManager) {

    RequestHeaderAuthenticationFilter filter = new RequestHeaderAuthenticationFilter();
    filter.setAuthenticationManager(authenticationManager);
    filter.setExceptionIfHeaderMissing(true);
    filter.setPrincipalRequestHeader("MY_HEADER");
    filter.setInvalidateSessionOnPrincipalChange(true);
    filter.setCheckForPrincipalChanges(false);
    filter.setContinueFilterChainOnUnsuccessfulAuthentication(false);
    return filter;
}
Run Code Online (Sandbox Code Playgroud)