Spring 运行 JUnit 测试时,安全性未调用我的自定义身份验证过滤器
Spring security not calling my custom authentication filter when running JUnit tests
我正在尝试通过遵循此 article
实现具有 Spring 安全性的自定义无状态身份验证
我面临的问题是我的自定义过滤器没有被框架调用,即使我的 SecurityConfig 看起来与之前的几乎一样link(更简单一些):
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("appAuthenticationProvider")
private AuthenticationProvider authenticationProvider;
@Autowired
@Qualifier("appAuthenticationFilter")
private AppAuthenticationFilter appAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests().anyRequest().authenticated()
.and()
.anonymous().disable()
.exceptionHandling().authenticationEntryPoint(unauthorizedEntryPoint());
http.addFilterBefore(appAuthenticationFilter, BasicAuthenticationFilter.class);
}
@Bean
public AuthenticationEntryPoint unauthorizedEntryPoint() {
return (request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
我没有 post authenticationProvider 和 appAuthenticationFilter 的代码,因为前者工作正常(我可以登录在使用 /login 端点)而后者只是实现 GenericFilterBean 并且甚至没有被调用。
如有任何帮助,我们将不胜感激!
好的,我发现在部署 Spring 启动应用程序时正在执行过滤器,并且仅在 运行 测试时才调用它们后,我找到了解决方案。然后我发现这个 post:
https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security
我忘记配置我的模拟 MVC 以使用过滤器。所以最后我的身份验证测试 class 如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = GasApplication.class)
@WebAppConfiguration
public class LoginControllerTest {
@Autowired
private WebApplicationContext context;
@Autowired
@Qualifier("appAuthenticationFilter")
private Filter appAuthenticationFilter;
private MockMvc mockMvc;
@Before
public void init() throws Exception {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilter(appAuthenticationFilter, "/resource")
.build();
}
// Tests here...
}
要不像前面的答案那样自动装配和手动设置过滤器,您可以使用 SecurityMockMvcConfigurers.springSecurity():
MockMvcBuilders
.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
我正在尝试通过遵循此 article
实现具有 Spring 安全性的自定义无状态身份验证我面临的问题是我的自定义过滤器没有被框架调用,即使我的 SecurityConfig 看起来与之前的几乎一样link(更简单一些):
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("appAuthenticationProvider")
private AuthenticationProvider authenticationProvider;
@Autowired
@Qualifier("appAuthenticationFilter")
private AppAuthenticationFilter appAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests().anyRequest().authenticated()
.and()
.anonymous().disable()
.exceptionHandling().authenticationEntryPoint(unauthorizedEntryPoint());
http.addFilterBefore(appAuthenticationFilter, BasicAuthenticationFilter.class);
}
@Bean
public AuthenticationEntryPoint unauthorizedEntryPoint() {
return (request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
我没有 post authenticationProvider 和 appAuthenticationFilter 的代码,因为前者工作正常(我可以登录在使用 /login 端点)而后者只是实现 GenericFilterBean 并且甚至没有被调用。
如有任何帮助,我们将不胜感激!
好的,我发现在部署 Spring 启动应用程序时正在执行过滤器,并且仅在 运行 测试时才调用它们后,我找到了解决方案。然后我发现这个 post:
https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security
我忘记配置我的模拟 MVC 以使用过滤器。所以最后我的身份验证测试 class 如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = GasApplication.class)
@WebAppConfiguration
public class LoginControllerTest {
@Autowired
private WebApplicationContext context;
@Autowired
@Qualifier("appAuthenticationFilter")
private Filter appAuthenticationFilter;
private MockMvc mockMvc;
@Before
public void init() throws Exception {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilter(appAuthenticationFilter, "/resource")
.build();
}
// Tests here...
}
要不像前面的答案那样自动装配和手动设置过滤器,您可以使用 SecurityMockMvcConfigurers.springSecurity():
MockMvcBuilders
.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();