Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存在授权标头时仍执行Spring安全忽略路径筛选器_Java_Spring_Spring Security - Fatal编程技术网

Java 存在授权标头时仍执行Spring安全忽略路径筛选器

Java 存在授权标头时仍执行Spring安全忽略路径筛选器,java,spring,spring-security,Java,Spring,Spring Security,我有一个完全工作的spring安全过程,其中一些路径需要身份验证(通过令牌),另外一些路径我希望在没有令牌的情况下保持开放和可访问。我遇到的问题是,当一个请求在没有授权头的情况下进入其中一个打开的路径时,过滤器将被忽略,并生成正确的响应。但是,当存在授权头时,即使在忽略的路径上,请求也会通过整个安全筛选链,而理想的过程是完全跳过筛选链 下面是我的配置 @覆盖 public void configure(WebSecurity web)引发异常{ 忽略 .antMatchers(默认忽略请求);

我有一个完全工作的spring安全过程,其中一些路径需要身份验证(通过令牌),另外一些路径我希望在没有令牌的情况下保持开放和可访问。我遇到的问题是,当一个请求在没有
授权
头的情况下进入其中一个打开的路径时,过滤器将被忽略,并生成正确的响应。但是,当存在
授权
头时,即使在忽略的路径上,请求也会通过整个安全筛选链,而理想的过程是完全跳过筛选链

下面是我的配置

@覆盖
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);
    }
}