我正在使用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();
已尝试更改筛选器链中筛选器的顺序。已尝试从筛选器链中删除其中一个请求,该操作工作正常。
1条答案
按热度按时间gzszwxb41#
我建议您使用AuthenticationEntryPoint,然后在入口点之前或之后添加过滤器。