如何为特定网址额外添加弹簧安全验证码过滤器
我正在寻找一种非侵入性的方法,为某些api调用添加验证码过滤器。
我的设置由两个组成,每个过滤器有一个过滤器(不是验证码过滤器):WebSecurityConfigurerAdapters
- 内部 API(“/iapi”在所有调用上使用筛选器 A,但也忽略一些公共请求,如 /authenticate)
- 外部 api(“/eapi”在所有调用中使用筛选器 B)
如何在Spring Security之前,在公共,内部API或外部API调用上添加过滤器?我不需要SecurityContext,只需要检查请求标头中的验证码,转发到filterChain(普通过滤器)或手动拒绝访问。我尝试在web.xml中声明过滤器,但这破坏了使用依赖关系注入的能力。
这是我的弹簧安全配置:
@EnableWebSecurity
public class SpringSecurityConfig {
@Configuration
@Order(1)
@EnableGlobalMethodSecurity(securedEnabled = true)
public static class InternalApiConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private Filter filterA;
public InternalApiConfigurerAdapter() {
super(true);
}
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/public/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/iapi/**")
.exceptionHandling().and()
.anonymous().and()
.servletApi().and()
.authorizeRequests()
.anyRequest().authenticated().and()
.addFilterBefore(filterA, (Class<? extends Filter>) UsernamePasswordAuthenticationFilter.class);
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return authenticationManager();
}
}
@Configuration
@Order(2)
@EnableGlobalMethodSecurity(securedEnabled = true)
public static class ExternalApiConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private FilterB filterB;
public ExternalApiConfigurerAdapter() {
super(true);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/external/**")
.exceptionHandling().and()
.anonymous().and()
.servletApi().and()
.authorizeRequests()
.anyRequest().authenticated().and()
.addFilterBefore(filterB, (Class<? extends Filter>) UsernamePasswordAuthenticationFilter.class);
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return authenticationManager();
}
}
更新:目前,我有一个工作配置,其中包含在web.xml中声明的过滤器。但是,它具有与Spring Context分开的缺点(例如,没有豆子的自动布线),因此我正在寻找利用Spring的更好解决方案。
摘要:还有两个剩余问题:
- 仅为特定 URL 添加筛选器 - 在任何配置中使用 beforeFilter(...) 将筛选器添加到该配置的所有 URL。Antmatchers不起作用。我需要这样的东西:/iapi/captcha/,/external/captcha/,/public/captcha/*。
- 我有一个完全绕过Spring Security的公共API:(web .ignoring() .antMatchers(“/public/**”);)。我需要绕过Spring Security,但仍然使用Spring自动布线,但不一定是Spring Security功能,因为我的验证码过滤器仅以无状态方式拒绝或转发呼叫。