Java 存在授权标头时仍执行Spring安全忽略路径筛选器
我有一个完全工作的spring安全过程,其中一些路径需要身份验证(通过令牌),另外一些路径我希望在没有令牌的情况下保持开放和可访问。我遇到的问题是,当一个请求在没有Java 存在授权标头时仍执行Spring安全忽略路径筛选器,java,spring,spring-security,Java,Spring,Spring Security,我有一个完全工作的spring安全过程,其中一些路径需要身份验证(通过令牌),另外一些路径我希望在没有令牌的情况下保持开放和可访问。我遇到的问题是,当一个请求在没有授权头的情况下进入其中一个打开的路径时,过滤器将被忽略,并生成正确的响应。但是,当存在授权头时,即使在忽略的路径上,请求也会通过整个安全筛选链,而理想的过程是完全跳过筛选链 下面是我的配置 @覆盖 public void configure(WebSecurity web)引发异常{ 忽略 .antMatchers(默认忽略请求);
授权
头的情况下进入其中一个打开的路径时,过滤器将被忽略,并生成正确的响应。但是,当存在授权
头时,即使在忽略的路径上,请求也会通过整个安全筛选链,而理想的过程是完全跳过筛选链
下面是我的配置
@覆盖
public void configure(WebSecurity web)引发异常{
忽略
.antMatchers(默认忽略请求);
}
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
authenticationTokenHeaderFilter.setAuthenticationManager(authenticationManager);
http.authorizeRequests()
.antMatchers(“/example/**”)
.authenticated()
.及()
.例外处理()
.accessDeniedHandler((请求、响应、accessDeniedException)->{
sendError(HttpServletResponse.SC_禁止,accessDeniedException.getMessage());
})
.authenticationEntryPoint(新的HttpAuthenticationEntryPoint())
.及()
.会议管理()
.sessionCreationPolicy(sessionCreationPolicy.STATELESS)
.及()
.cors()
.及()
.csrf().disable()
.addFilter(authenticationTokenHeaderFilter)
.addFilterBefore(新的例外TranslationFilter(
新的Http403ForbiddenEntryPoint()),
authenticationTokenHeaderFilter.getClass()
);
}
我还尝试使用permitAll()
将忽略的路径放入HttpSecurity
,但没有成功
澄清
String[]DEFAULT\u IGNORE\u REQUESTS=新字符串[]{“/exactor”};
在上面描述的内容中,任何前往/example/**
的请求都应该通过安全链和我的过滤器,以确保用户经过身份验证。任何到/exactor
的请求都不应通过安全过滤器链。/example/**
工作正常,符合预期。但是,执行器不工作
当我在没有Authorization
头的情况下发出请求时,不会调用安全链。
当我在
Authorization
标头存在的情况下发出请求时,将调用安全链并验证Authorization
值(令牌)。如果令牌无效,则会在筛选器内引发自定义异常。即使抛出错误,我也会从/exactor
获得预期的响应。但是,本例中抛出的错误会被记录并生成堆栈跟踪,我不希望这样,因为它在本例中不是错误。在Spring Boot中,任何@Bean
类型的过滤器都会被添加为servlet过滤器。最可能发生的情况是,您的过滤器被添加为与过滤器链完全分离的过滤器
您可以在WebSecurityConfigureAdapter
中初始化AuthenticationTokenHeaderFilter
并直接设置AuthenticationManager
,而不是将筛选器声明为@Bean
。因此,您可以删除筛选器中的@Autowired
注释。在Spring Boot中,任何@Bean
类型的筛选器都将添加为servlet筛选器。最可能发生的情况是,您的过滤器被添加为与过滤器链完全分离的过滤器
您可以在WebSecurityConfigureAdapter
中初始化AuthenticationTokenHeaderFilter
并直接设置AuthenticationManager
,而不是将筛选器声明为@Bean
。因此,您可以删除筛选器中的@Autowired
注释。您可以添加authenticationTokenHeaderFilter的源代码吗?@NatFar已添加到原始帖子中。然后,AuthenticationManager
管理验证授权
令牌是否正确,并可能抛出错误,然后由我处理。我这里的全部问题是,我只希望在尝试访问安全路径时抛出这些错误。我可以通过检查AuthenticationManager
中的路径是否有效来构建一个混乱的解决方案,但我想有一种方法可以让Spring来处理它。@NTL你调用什么URL?DEFAULT\u IGNORE\u REQUESTS
的值是多少?您说如果授权头位于“忽略路径”(如与默认\u IGNORE\u请求匹配的路径或用户不需要进行身份验证的其他路径)上,则会调用筛选链?@NatFar抱歉我周末不在。更新了澄清
标题下的原始帖子。能否添加authenticationTokenHeaderFilter的源代码?@NatFar已添加到原始帖子中。然后,AuthenticationManager
管理验证授权
令牌是否正确,并可能抛出错误,然后由我处理。我这里的全部问题是,我只希望在尝试访问安全路径时抛出这些错误。我可以通过检查AuthenticationManager
中的路径是否有效来构建一个混乱的解决方案,但我可以想象有一种方法可以通过使用Spring来实现
public class AuthenticationTokenHeaderFilter extends AbstractPreAuthenticatedProcessingFilter {
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest httpServletRequest) {
return httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
}
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest httpServletRequest) {
return "N/A";
}
@Override
@Autowired
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
}