【问题标题】:request.getUserPrincipal() is null in RequestListener despite that authentication succeeded尽管身份验证成功,但 Request.getUserPrincipal() 在 RequestListener 中为 null
【发布时间】:2015-03-24 16:43:59
【问题描述】:

我们遇到了 Tomcat 最新版本的问题,导致我们无法升级到高于 7.0.22 之类的版本。

我们将 FormBasedAuthentication 与自定义领域一起使用。

这是在 Windows 上使用 Tomcat 7.0.57 和 JDK 7u76 测试的。

我的设置有一个调用 j_security servlet 的登录表单。调用自定义领域并且身份验证成功,返回自定义主体。

Tomcat 然后将转发到受保护的资源,我们在 RequestListener 中捕获请求。

问题是,request.getUserPrincipal() 返回 null。调试器显示,request.getSession(false)(SessionWrapper 的实例,包含 StandardSession)返回的 sessionwrapper 有一个字段“principal”,其中包含从我的领域返回的主体。

我在 bugzilla 中看到了关于在非受保护请求上返回 userprincipal 的要求的讨论,但这里的请求正在调用受保护的资源。

任何关于为什么会发生这种情况的想法都会非常有帮助。实际上,我认为这是一个错误,即请求未经过身份验证但仍被提供。

完全相同的设置在 Tomcat 7.0.12 上就像一个魅力,我认为到 7.0.22。

最好的问候,

托马斯

这里是请求监听的代码:

@Override
public void requestInitialized(ServletRequestEvent event) {
    if( log.isTraceEnabled() ) {
        log.trace( ">> requestInitialized" );
    }
    HttpServletRequest request = (HttpServletRequest)event.getServletRequest();
    PortalRequest.current.set( request );
    HttpSession httpSession = null;
    GenericPrincipal genericPrincipal = (GenericPrincipal)request.getUserPrincipal();

// genericPrincipal is null, requestURI is pointing to a protected resource.

这是 web.xml 中的表单认证配置

<welcome-file-list>
<welcome-file>jsp/main.jsp</welcome-file>
</welcome-file-list>

<security-constraint>
<display-name>PDiX Portal</display-name>
<web-resource-collection>
  <web-resource-name>PDX Portal Protected</web-resource-name>
  <url-pattern>/jsp/*</url-pattern>
</web-resource-collection>
<web-resource-collection>
  <web-resource-name>servlets</web-resource-name>
  <url-pattern>/servlet/*</url-pattern>
</web-resource-collection>
<web-resource-collection>
  <web-resource-name>GWT Resourcen</web-resource-name>
  <url-pattern>/StandardPortal/*</url-pattern>
</web-resource-collection>
<web-resource-collection>
  <web-resource-name>services</web-resource-name>
  <url-pattern>/delegating/*</url-pattern>
</web-resource-collection>
<web-resource-collection>
  <web-resource-name>ViewerServlet</web-resource-name>
  <url-pattern>/frameset</url-pattern>
  <url-pattern>/run</url-pattern>
</web-resource-collection>
<web-resource-collection>
  <web-resource-name>EngineServlet</web-resource-name>
  <url-pattern>/preview</url-pattern>
  <url-pattern>/download</url-pattern>
  <url-pattern>/parameter</url-pattern>
  <url-pattern>/document</url-pattern>
  <url-pattern>/output</url-pattern>
  <url-pattern>/extract</url-pattern>
</web-resource-collection>
<auth-constraint>
  <role-name>authenticatedUser</role-name>
</auth-constraint>

形式 PDXRealm /jsp/login.jsp /logout.jsp?error=true 认证用户

[更新问题以反映与请求侦听器的连接]

【问题讨论】:

    标签: java tomcat form-authentication j-security-check


    【解决方案1】:

    在 konstantin Kolinko 的帮助下,tomcat 用户列表中的问题得到了解决。

    从 Tomcat 7.0.22 开始,身份验证发生在触发 servlet 请求侦听器之后。这有副作用,请求侦听器不能再用于在会话中设置应用程序身份验证。

    引用康斯坦丁的话:

    更改日志文件中针对 7.0.22 有以下更改:

    [quote] 使用 51653 的修复程序更正回归,该修复程序破坏了自定义 来自身份验证器的 4xx 响应的错误页面。错误处理 并且请求侦听器现在在 StandardHostValve 中处理以 确保它们包含所有上下文级别的活动。 (markt) [/quote]

    所以,我的解决方案是找到另一种设置我的东西的方法,这很可能是一个过滤器。

    我浏览了 Servlet 3.0 规范,以找到有关调用 requestInitialized() 时请求状态的任何提示,但没有给出具体要求(或者我没有找到它们)。

    希望其他人也会觉得这很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2017-04-21
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多