【问题标题】:request.getRemoteUser() sometimes returns nullrequest.getRemoteUser() 有时会返回 null
【发布时间】:2011-08-26 14:12:56
【问题描述】:

我有一个使用 struts2 和旧式 servlet 的 java-web-application。 使用 Acegi 安全性。

在我的 servlet 中,我正在记录用户正在尝试做什么以及它是哪个用户。使用request.getRemoteUser()获取用户即时消息

但令我大吃一惊的是,结果并不一致。大多数时候getRemoteUser() 返回正确的用户名,但每隔一段时间我就会得到一个空值。

这背后的原因是什么?

编辑: 根据您的反馈,我发现 servlet-url 根本不受安全保护。所以这可能导致getRemoteUser()为空。我现在将为这些实施安全性并在回发结果之前进行更多测试。

【问题讨论】:

  • 根据JavaDoc“如果用户已通过身份验证,则返回发出此请求的用户的登录名,如果用户尚未通过身份验证,则返回null。是否与每个后续请求一起发送用户名取决于浏览器和身份验证类型。与 CGI 变量 REMOTE_USER 的值相同。”所以可能是 Acegi/Browser 没有按预期设置远程用户。

标签: java servlets struts2 spring-security


【解决方案1】:

getRemoteUser() 将返回已登录的用户,否则将返回 null。

您使用哪种身份验证(带有基本/摘要的 Jaas 等)?

对于特定的 URL(servlet),您是否看到此错误?在这种情况下,该 URL 可能具有其他安全约束。

另一个原因是客户端(浏览器)没有在请求中发送用户名。如果您位于请求身份验证的 URL 树之外,则可能会发生这种情况。

【讨论】:

    【解决方案2】:

    登录表单是否被 Acegi Security 过滤(loginFormUrl of AuthenticationProcessingFilterEntryPoint)?

    如果是,获取登录用户名

    SecurityContextHolder.getContext().getAuthentication().getName();
    

    【讨论】:

      【解决方案3】:

      doc 说明了为什么你会得到 null:

      如果用户已通过身份验证,则返回发出此请求的用户的登录名,如果用户尚未通过身份验证,则返回 null。用户名是否随每个后续请求一起发送取决于浏览器和身份验证类型。与 CGI 变量 REMOTE_USER 的值相同。

      您需要调查导致问题的浏览器。

      【讨论】:

        猜你喜欢
        • 2014-02-25
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        相关资源
        最近更新 更多