Spring安全过滤器链不工作

fiei3ece  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(143)

我正在使用spring security来验证我的GET和POST请求。GET和POST的授权机制是不同的。下面的代码片段来自我的SecurityConfig的configure方法。FilterA用于GET请求,我已经定义了一个customBAuthenticationManager bean,它为GET请求实现了AuthenticationManager。FilterB用于POST请求,我已经定义了带有UserDetails服务的customAuthProvider。当单独添加时,get和post请求可以正常工作。但是当这两个过滤器一个接一个地添加时,过滤器链中的第一个请求失败,但第二个请求可以正常工作。例如,使用下面的代码,我的POST请求工作正常,但GET请求(链中的第一个)抛出401错误。如果我交换get和post的顺序,那么GET可以正常工作,但是POST(链中的第一个)抛出403错误。但在所有情况下,我都可以看到自定义身份验证管理器/提供程序工作正常。
有人能告诉我到底出了什么问题吗?

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        FilterA filtera = new FilterA();
        filtera.setCheckForPrincipalChanges(true);
        filtera.setAuthenticationManager(customBAuthenticationManager());

        FilterB filterb = new FilterB();
        filterb.setCheckForPrincipalChanges(true);
        filterb.setAuthenticationManager(authenticationManager());

        httpSecurity
            .headers()
                .frameOptions()
                    .disable()
                .and()
            .mvcMatcher("/**")
            .csrf()
                .disable()
            .requestCache()
                .requestCache(getHttpSessionRequestCache())
                .and()
            .sessionManagement()
                .maximumSessions(1)
                .and()
            .and()
                .addFilter(filtera)
                .authorizeRequests()
                .mvcMatchers("/getrequest/**")
                .authenticated()
            .and()
                .addFilter(filterb)
                .authenticationProvider(customAauthProvider())
                .authorizeRequests()
                .mvcMatchers("/postrequest/**")
                .authenticated()
            .and()
                .authorizeRequests()
                .mvcMatchers("/different-open-request/**")
                .permitAll()
                .and()
                .httpBasic();

已尝试更改筛选器链中筛选器的顺序。已尝试从筛选器链中删除其中一个请求,该操作工作正常。

gzszwxb4

gzszwxb41#

我建议您使用AuthenticationEntryPoint,然后在入口点之前或之后添加过滤器。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .headers().frameOptions().disable()
            .and().requestCache().requestCache(getHttpSessionRequestCache())
            .and().exceptionHandling().authenticationEntryPoint(authenticationEntrypoint)
            .and().authorizeRequests().anyRequest().authenticated().and()
            .addFilterAfter(new myAFilter(), BasicAuthenticationFilter.class).addFilter(new Filter() {
                @Override
                public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                    filterChain.doFilter(servletRequest,servletResponse);
                }
            });
}

相关问题