【问题标题】:User (%u) is missing from Tomcat Access Logs when using Spring Security使用 Spring Security 时,Tomcat 访问日志中缺少用户 (%u)
【发布时间】:2020-03-02 15:45:22
【问题描述】:

我在 Apache Tomcat 8 中运行了一个示例 Spring Security (hello world) web 应用程序。我试图查看的是 Tomcat 访问日志中的用户信息,但看起来该信息不存在。访问日志条目示例:

0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:57 +0200] "GET / HTTP/1.1" 200 422
0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:59 +0200] "GET /hello HTTP/1.1" 200 83

Tomcatserver.xml中的访问日志配置为:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="common" />

pattern="common" 对应于由 '%h %l %u %t "%r" %s %b' 定义的通用日志格式,如 here 所述。 Tomcat 文档还指出:

%u - 已通过身份验证的远程用户(如果有),否则为 '-'

我应该应用任何其他配置来使用户在访问日志中可见吗?

【问题讨论】:

    标签: java authentication tomcat spring-security access-log


    【解决方案1】:

    作为answered,它可能无法按预期工作

    Tomcat 的访问日志阀,这不起作用,因为 Tomcat 不知道 Spring Security,它完全在您的应用程序中运行。

    您可以使用过滤器:

    最简单的选择是在 Spring Security 之后添加您自己的过滤器(例如在 web.xml 中),然后转储您想要的信息

    其他解决方案suggested in Config9,您可能需要包含用户名作为会话属性

    这可能还不够,因为常见模式已经包含 %u 参数。在这种情况下,我会推荐两个额外的步骤:

    1) 将用户名放入请求会话参数中,例如:

    request.getSession().addAttribute("username", user.getName());
    

    2) 在访问日志模式中添加以下参数:%{username}s

    server.tomcat.accesslog.pattern=%h %l %t %u %{username}s "%r" %s %b
    

    【讨论】:

    • 您是否有一些示例,该过滤器应该如何显示给用户?
    • @StiliyanVasilev 见code-held.com/2019/05/09/…
    • 我已经实现了自定义过滤器并尝试通过 %{username}s 在访问日志中打印它并且它工作正常。我还尝试通过 %reqAttribute{username} 使用 LogbackValve 打印日志,但它返回“-”。你知道如何在 LogbackValve 场景中获取用户名吗?
    • @StiliyanVasilev 我目前不知道
    • @StiliyanVasilev 我想你可以问一个关于使用带有会话属性的 LogbackValve 进行日志记录的新的具体问题
    猜你喜欢
    • 2015-09-29
    • 2014-06-29
    • 2012-03-31
    • 2020-03-30
    • 2017-09-25
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多