我的应用程序同时提供API和浏览器。我已经对所有自定义提供程序和过滤器实施了API令牌身份验证。现在配置似乎会干扰浏览器版本。
我有两个问题,我需要有关如何解决的建议,因为我在挖掘文档和其他示例后没有得到任何答案。
1)尽管有请求,我的StatelessAuthenticationFilter
仍被调用
来自浏览器。我有例如将请求匹配器指定为" / api / **"。那是为什么?
2)AuthenticationManager
尚未注册两个AuthenticationProvider
。这是我调试StatelessAuthenticationFilter
被错误调用后的结论。
这是我拥有的配置类
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Order(1)
@Configuration
public static class A extends WebSecurityConfigurerAdapter {
@Autowired
TokenAuthenticationProvider tokenAuthenticationProvider;
@Autowired
ApiEntryPoint apiEntryPoint;
@Override
protected void configure(HttpSecurity http) throws Exception {
StatelessAuthenticationFilter filter = new StatelessAuthenticationFilter();
AntPathRequestMatcher requestMatcher = new AntPathRequestMatcher("/api/**");
filter.setRequiresAuthenticationRequestMatcher(requestMatcher);
filter.setAuthenticationManager(super.authenticationManager());
http.csrf().disable()
.exceptionHandling().authenticationEntryPoint(apiEntryPoint)
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(tokenAuthenticationProvider);
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/api/user/register");
}
}
@Configuration
public static class B extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(new DaoAuthenticationProvider());
}
}
}
如您所见,B类没有指定任何内容,但是当我访问localhost:8080时,会调用StatelessAuthenticationFilter。这是怎么回事?
答案 0 :(得分:0)
在A类中,您正在配置StatelessAuthenticationFilter以使用requestMatcher。无论你做什么,春天都不知道或不关心。 您还必须使用
限制安全配置 http.antMatcher("/api/**")
否则为每个URI配置它,并且将为每个请求调用StatelessAuthenticationFilter,完全如您所述。
您还应该使用@Order注释A和B类,如multiple-httpsecurity中的示例所示