【问题标题】:Servlet principal in high precedence filter, using Spring Security高优先级过滤器中的 Servlet 主体,使用 Spring Security
【发布时间】:2016-09-13 18:57:41
【问题描述】:

我们的 Spring Boot 1.3.3 应用程序使用 Spring Security。我们需要记录 HTTP 请求,包括请求的 URL、HTTP 动词、处理时间、用户主体。

这是使用自定义 servlet 过滤器完成的。

自定义过滤器的优先级必须比 Spring Security 过滤器链更高(即更小的顺序),否则它不会被 Spring Security 拒绝的请求执行。

但是在自定义过滤器中,HttpServletRequest:getUserPrincipal 总是为空。一旦他的安全链完成,Spring Security 似乎会删除安全信息。

在使用 Spring Security 时,是否有一种标准方式(意味着没有线程本地魔法)始终从自定义过滤器中获取用户主体?

感谢您的宝贵时间。

【问题讨论】:

    标签: spring servlets spring-security spring-boot servlet-filters


    【解决方案1】:

    当您使用 Spring Security 时,主体很可能由 Spring Security 机器精确设置。但更糟糕的是,它使用了请求包装,因此在调用 FilterChain 之前您将找不到主体,因为它尚未设置,也不会在之后因为它被设置在不再存在的 HttpServletRequestWrapper 中。

    所以恕我直言,您最好的选择是在 Spring Security 链中放置一个自定义过滤器,就在 ExceptionTranslationFilter 之前,在链接后记录并传递任何异常。

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2021-03-11
      • 2013-02-13
      • 2013-04-09
      相关资源
      最近更新 更多