9

我正在尝试按照这篇文章使用 Spring Security 实现自定义无状态身份验证

我面临的问题是框架没有调用我的自定义过滤器,即使我的 SecurityConfig 看起来与上一个链接中的几乎相同(有点简单):

@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);
    }
}

我没有发布authenticationProviderappAuthenticationFilter的代码,因为前者工作正常(我可以使用 /login 端点登录),而后者只是实现了GenericFilterBean甚至没有被调用。

任何帮助将非常感激!

4

2 回答 2

8

好的,在我注意到部署 Spring Boot 应用程序时正在执行过滤器后,我找到了解决方案,并且仅在运行测试时才调用它们。然后我发现了这个帖子:

https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security

我忘了配置我的模拟 MVC 以使用过滤器。所以最后我的身份验证测试类如下所示:

@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...
}
于 2015-05-27T14:04:06.443 回答
2

要不像前面的答案那样手动自动装配和设置过滤器,您可以使用 SecurityMockMvcConfigurers.springSecurity():

MockMvcBuilders
.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
于 2017-03-15T11:23:55.903 回答