依赖项: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)
我想出了两个满足我用例的解决方案。如果你遇到这篇文章有更好的答案,请分享它。
据我所知,您有以下用例:
>
用户通过某些第三方应用程序(即不是您的应用程序)进行身份验证
一旦用户访问你的应用程序,你就会得到auth头并检查用户是否经过身份验证。
对于这个用例,最好扩展AbstractPreAuthenticatedProcessingFilter。
如果存在有效的身份验证头,预身份验证过滤器将在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文档中的语法