Java 为什么这个基于令牌的Spring安全过滤器没有被调用?

Java 为什么这个基于令牌的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

我目前正在从事一个项目,其中我使用AngularJS和SpringREST服务。最近几天,我一直在努力使系统具有一定的安全性()。我正在实现基于令牌的安全性

我已经完成了基本的工作,但是在完成请求时不会调用XAuthTokenFilter。我不知道为什么,我想我忽略了一些非常简单的事情。相关类别:

XAuthTokenFilter(doFilter不会在每个请求中调用)

XAuthTokenConfigurer

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);
    }
}
我真的不知道为什么它没有被调用,我的url
antMatcher()
语句有什么问题吗

我的背景可能包括:

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