当前位置: 首页 > 知识库问答 >
问题:

Spring Security自定义过滤器创建无限循环

澹台星剑
2023-03-14

依赖项:Spring Boot 1.1.5。释放,Spring4.0.6。Spring安全释放装置3.2.4。释放

问题:我正在创建一个自定义过滤器,该过滤器基于请求中的令牌查询提供者以验证用户。这里有自定义筛选器代码和配置。正如你所看到的,我已经尽可能地禁用了以查明问题。启用调试显示

Security filter chain: [
  WebAsyncManagerIntegrationFilter
  CustomAuthenticationFilter
  SecurityContextPersistenceFilter
  SecurityContextHolderAwareRequestFilter
  FilterSecurityInterceptor
]

另一件事是日志告诉我用户已通过身份验证。

当查询应用程序时,会发生无限循环并最终返回请求,curl说它无法遵循那么多重定向,postman说服务器有问题。我已经阅读了一些关于无限循环的帖子,因为登录页面是安全的。就我而言,我不想在我的应用程序中启用任何登录。如果我无法验证用户身份,则将返回401/403状态。请记住,该应用程序充当客户端请求的身份验证代理,但它本身不是客户端。我请求帮助找出当前配置中的错误,或者确认我的方法不起作用?无论如何,提前感谢您的帮助。

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig
    extends WebSecurityConfigurerAdapter {
    @Value("${oauth.check_token.url:http://localhost:3030/oauth/token/info}")
    private String checkTokenUrl;

    @Autowired @Qualifier("restTemplate")
    private RestOperations authRestTemplate;

[编辑]我发现如果我不使用postman,如果我不告诉curl遵循重定向,无限循环就会停止。下面是将CustomAuthenticationFilter放在SecurityContextPersistentFilter之前得到的完整日志。

************************************************************

    Request received for GET '/test-oauth':

    org.apache.catalina.connector.RequestFacade@35a0339c

    servletPath:/test-oauth
    pathInfo:null
    headers: 
    user-agent: curl/7.30.0
    host: localhost:8081
    accept: */*
    authorization: Bearer 8f58520f137b25b096b48a67135c5b9b294892a8c712d5c2bcb8d90ab9f6efd0


    Security filter chain: [
      WebAsyncManagerIntegrationFilter
      CustomAuthenticationFilter
      SecurityContextPersistenceFilter
      SecurityContextHolderAwareRequestFilter
      FilterSecurityInterceptor
    ]


    ************************************************************


    2014-08-23 18:54:39.453 DEBUG --- [nio-8081-exec-1] CustomAuthenticationFilter : Request is to process authentication
    2014-08-23 18:54:39.453 DEBUG --- [nio-8081-exec-1] CustomAuthenticationFilter : Attempting to authenticate: Bearer 8f58520f137b25b096b48a67135c5b9b294892a8c712d5c2bcb8d90ab9f6efd0
    2014-08-23 18:54:39.569 DEBUG --- [nio-8081-exec-1] CustomAuthenticationFilter : Authentication success. Updating SecurityContextHolder to contain: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@93e3eff0: Principal: com.shift.sysops.auth.AuthSSOUser@f02988d6: Username: username; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_USER

如果我将自定义过滤器放置在任何其他位置,它会抛出一个NPE,因为SecurityContextPersistenceFilter中的SecurityContextRepository为null。

2014-08-23 18:41:50.060 ERROR --- [nio-8081-exec-1] [dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.NullPointerException: null
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.security.web.debug.DebugFilter.invokeWithWrappedRequest(DebugFilter.java:70)
    at org.springframework.security.web.debug.DebugFilter.doFilter(DebugFilter.java:59)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:89)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:683)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1720)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1679)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

共有2个答案

岳毅
2023-03-14

我想出了两个满足我用例的解决方案。如果你遇到这篇文章有更好的答案,请分享它。

  1. 覆盖匿名身份验证过滤器
  2. 扩展抽象自动验证处理过滤器。
荣俊
2023-03-14

据我所知,您有以下用例:

>

  • 用户通过某些第三方应用程序(即不是您的应用程序)进行身份验证

    一旦用户访问你的应用程序,你就会得到auth头并检查用户是否经过身份验证。

    对于这个用例,最好扩展AbstractPreAuthenticatedProcessingFilter。

    1. 您可以通过扩展AbstractPreAuthenticatedProcessingFilter来定义自定义预验证筛选器
    2. 在自定义筛选器中,需要重写两个方法getPreAuthenticatedPrincipal()和getPreAuthenticatedCredentials()
    3. 在getPreAuthenticatedPrincipal()中,您可以检查请求中是否存在身份验证标头,如果存在,请将标头名称作为主体返回,并在凭据中返回标头值
    4. 使用PreAuthenticatedAuthenticationProvider并提供您的自定义preAuthenticatedUserDetailsService(通过扩展AuthenticationUserDetailsService)来检查身份验证令牌是否有效,如果有效,还可以获取授予的权限,否则会引发身份验证异常,如BadCredentialsException
    5. 创建实现AuthenticationEntryPoint的自定义AuthenticationEntryPoint,并重写Comment方法以返回401响应

    如果存在有效的身份验证头,预身份验证过滤器将在springSecurityContext中设置已验证用户,如果身份验证头丢失/无效,将返回402错误响应。

    希望有帮助。

  •  类似资料:
    • 问题内容: 我想实现一个过滤器来执行身份验证,但是不知何故它陷入了无限循环中……任何想法都值得赞赏。 调试模式下的这段代码仅无限次运行,基本上,我想在用户未登录时将其重定向到login.jsp。任何答复表示赞赏。 问题答案: 这里, 您将向目标页面发送 新的 HTTP请求,而不是使用当前请求。如果此新的HTTP请求被映射到过于通用的网址格式(例如),则当然会再次点击过滤器。并且将执行相同的检查,并

    • 问题内容: 我正在尝试找出使用TypeScript创建自定义角度过滤器的最佳方法。 我看到的所有代码示例都使用类似以下内容的代码: …可以,但是由于我想将所有过滤器代码分开而显得有些混乱。所以我想知道如何将过滤器声明为一个单独的文件(例如,filters / reverse- filter.ts),这样我就可以创建它: …以与控制器,服务等相同的方式 TS和Angular的文档在地面上似乎很薄,尤

    • 演示在网关追加一个header public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 演示在网关追加heade

    • SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下: Bolt Filter 新建自定义 Filter 。 public class CustomFilter

    • 问题内容: 如何使用带有此类JSON的NEST配置索引: 我可以使用类创建自定义分析器,但找不到如何创建自定义过滤器并将其注册到分析器中的方法。 提前致谢! 问题答案: 经过一番搜索,我找到了一个解决方案:

    • 问题内容: 我试图在Log4J2中实现和配置自定义过滤器- 基于ThresholdFilter,但打算做更多。我已经看到了有关自定义追加程序的主题,这些主题遵循相同的插件注释语法,但是还没有找到有关自定义拟合程序的主题。 MyCustomFilter.java (基于ThresholdFilter) log4j2.xml LoggingRunner.java 配置语法似乎与Apache文档中的语法