我编写了一个在HTTP请求的Principal上运行的过滤器。因此,在我的应用程序中,我确保它在Spring Security过滤器之后运行。它工作正常。
但是,我在测试时遇到了麻烦。我阅读this并按照步骤创建此测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class MyTest {
@Autowired
private WebApplicationContext context;
@Autowired
private Filter springSecurityFilterChain;
private MockMvc mvc;
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.addFilters(springSecurityFilterChain, new MyFilter())
.build();
}
@Test
public void anonymousCallsNotLogged() throws Exception {
mvc.perform(post("/").with(anonymous()));
}
public static class MyFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Configuration
@EnableWebSecurity
@EnableWebMvc
static class Config extends WebSecurityConfigurerAdapter {
}
}
当我调试它时,我看不到我的过滤器,但我确实看到Spring Security过滤器工作。
但是,当我切换订单时:
.addFilters(new MyFilter(), springSecurityFilterChain)
我看到两个火。不幸的是错误的顺序!看起来Spring Security的东西并没有调用过滤器链的其余部分。
我的问题是 - 为什么会发生这种情况,我该怎么办呢?