Java 为什么这个基于令牌的Spring安全过滤器没有被调用?
我目前正在从事一个项目,其中我使用AngularJS和SpringREST服务。最近几天,我一直在努力使系统具有一定的安全性()。我正在实现基于令牌的安全性 我已经完成了基本的工作,但是在完成请求时不会调用XAuthTokenFilter。我不知道为什么,我想我忽略了一些非常简单的事情。相关类别: XAuthTokenFilter(doFilter不会在每个请求中调用) XAuthTokenConfigurerJava 为什么这个基于令牌的Spring安全过滤器没有被调用?,java,angularjs,spring,spring-mvc,spring-security,Java,Angularjs,Spring,Spring Mvc,Spring Security,我目前正在从事一个项目,其中我使用AngularJS和SpringREST服务。最近几天,我一直在努力使系统具有一定的安全性()。我正在实现基于令牌的安全性 我已经完成了基本的工作,但是在完成请求时不会调用XAuthTokenFilter。我不知道为什么,我想我忽略了一些非常简单的事情。相关类别: XAuthTokenFilter(doFilter不会在每个请求中调用) XAuthTokenConfigurer public class XAuthTokenConfigurer extends
public class XAuthTokenConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
private TokenProvider tokenProvider;
private UserDetailsService detailsService;
public XAuthTokenConfigurer(UserDetailsService detailsService, TokenProvider tokenProvider) {
this.detailsService = detailsService;
this.tokenProvider = tokenProvider;
}
@Override
public void configure(HttpSecurity http) throws Exception {
XAuthTokenFilter customFilter = new XAuthTokenFilter(detailsService, tokenProvider);
http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
}
}
我真的不知道为什么它没有被调用,我的urlantMatcher()
语句有什么问题吗
我的背景可能包括:
@Configuration
@EnableWebMvc
@Import(AppContext.class) // The context from my backend which is included as a dependency
@ComponentScan("com.example.springsecuritytest")
public class RestContext extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
}
WebAppInitializer
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//RootContext
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(RestContext.class);
// Add RootContext using ContextLoaderListener
servletContext.addListener(new ContextLoaderListener(rootContext));
// Registering and mapping dispatcher servlet
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
请看看这个。我已经准备了一个非常基本的设置,可以测试有无
tokenAuthenticationFilter
的安全性。筛选器实现只是一个模拟,在头出现时设置有效的身份验证,而不管其值如何。还请注意两个应用程序WebApplicationInitializers
,它们是Servlet 3.0
兼容的,并且以编程方式配置Servlet容器(而不是web.xml)。您得到的请求和响应是什么?即使请求中有有效的令牌,您是否仍收到未经授权的异常?不,它不会被调用,请使用断点尝试,但未被访问。所有请求都会成功,甚至没有x-auth-token头的请求(我使用Postman浏览器插件尝试请求),因此令牌甚至不会得到验证,因为筛选器从未运行过。所有url(/api/open和/api/protected)所有这些都通过了,没有被拦截,也没有首先通过过滤器。所以安全过滤器链根本就没有被调用?我有一个使用xml配置的自定义令牌身份验证过滤器的类似设置,我的web.xml中有以下内容:springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain/*
是的,但这一行会将其添加到链中,对吗<代码>http.addFilterBefore(customFilter,UsernamePasswordAuthenticationFilter.class)代码>这真的很奇怪,虽然我从未指定过滤器映射到哪个url,但我应该在任何地方这样做吗?在我从(JHipster)得到的示例中,过滤器没有@Filter注释,也没有URL映射,您认为这有必要吗?感谢您的努力和示例!但这似乎是一种完全不同的工作方式,我目前并不是真的在寻找,我希望保留配置,就像现在这样,根据JHipster,它应该可以工作。似乎我错过了一个JHipster骨架文件,或者我忽略了其他一些东西。我确实要再次明确地感谢您编写了这个示例,它肯定会派上用场!!我已尝试将配置保持尽可能小。如果您查看无状态Web安全配置
,您应该注意到我只做了几件与您不同的事情:1。保护所有URI;2.使用内存授权与用户详细信息服务和3。将tokenAuthFilter
放在basicAuthFilter
之前,然后调用httpBasic()
Hmm好吧,我将尝试让我的与你的更相似,看看它是否修复了任何问题!只需尝试放置.anyRequest().authenticated()
而不是antMatcher()
语句,并在末尾添加.and().httpBasic()
,但所有请求仍然通过,不会被捕获或以任何方式延迟:/
@Configuration
@EnableWebMvc
@Import(AppContext.class) // The context from my backend which is included as a dependency
@ComponentScan("com.example.springsecuritytest")
public class RestContext extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
}
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//RootContext
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(RestContext.class);
// Add RootContext using ContextLoaderListener
servletContext.addListener(new ContextLoaderListener(rootContext));
// Registering and mapping dispatcher servlet
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}