使用 Spring Security 时,Tomcat 访问日志中缺少用户 (%u)

Sti*_*lev 5 java authentication tomcat spring-security access-log

我在 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
Run Code Online (Sandbox Code Playgroud)

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

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="common" />
Run Code Online (Sandbox Code Playgroud)

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

%u - 经过身份验证的远程用户(如果有),否则为“-”

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

use*_*900 5

正如所回答的,它可能无法按预期工作

\n\n
\n

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

\n
\n\n

您可以使用过滤器:

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n\n

1) 将 user\xe2\x80\x99s 名称放入请求会话参数中,如下所示:

\n\n
request.getSession().addAttribute("username", user.getName());\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
server.tomcat.accesslog.pattern=%h %l %t %u %{username}s "%r" %s %b\n
Run Code Online (Sandbox Code Playgroud)\n
\n