UserDetailsService 中注入的 HttpServletRequest 不是过滤器添加的包装后的 HttpServletRequest 吗?



如何放置我的自定义过滤器,它使用HttpServletRequestWrapper包装HttpServletRequest,以便@Autowired在我的自定义UserDetailsServiceHttpServletRequest,以便它看到包装的HttpServletRequest而不是普通HttpServletRequest

让我尝试解释一下:在我的自定义过滤器中,我分析了子域和域,并通过用HttpServletRequestWrapper包装并覆盖getHeader()将方便的信息放入HttpServletRequest中。

但是当我使用@Autowiredin 注入HttpServletRequest时,UserDetailsService注入的HttpServletRequest不是包装的,并且不包含我的自定义过滤器添加的信息。

在我的web.xml中,我将过滤器放在所有弹簧过滤器(ContextLoaderListenerRequestContextListenerDelegatingFilterProxy)之前,所以我的过滤器应该是第一个内联的。这确实让我感到疑惑。

请注意,当我在普通控制器中注入HttpServletRequest时,它会注入包装的HttpServletRequestUserDetailsService可能是一个特例。

有人有好主意吗?

似乎在UserDetailsService中注入的HttpServletRequest与普通控制器不同。

在普通控制器中,request.getHeader 调用会导致对包装的 request.getHead 的调用。在UserDetailsService中,情况似乎并非如此。我怀疑UserDetailsService中的HttpServletRequest是一个副本,并且没有包装/代理原始HttpServletRequest,也许它需要序列化。

但幸运的是可以使用request.setAttribute,请求属性在UserDetailsService和普通控制器中注入的HttpServletRequest中可用。

请注意,上面有点笨拙。根据您的用例,您可能需要阅读 @M. Deinum 的有趣评论,并使用由自定义 AuthenticationDetailsSource 生成的自定义 WebAuthenticationDetails 中的数据进行 AuthenticationProvider 路由。