Java 使用Spring Security时,Tomcat访问日志中缺少用户(%u)
我在ApacheTomcat8中运行了一个示例SpringSecurity(HelloWorld)web应用程序。我试图看到的是Tomcat访问日志中的用户信息,但看起来这些信息并不存在。访问日志条目的示例:Java 使用Spring Security时,Tomcat访问日志中缺少用户(%u),java,authentication,tomcat,spring-security,access-log,Java,Authentication,Tomcat,Spring Security,Access Log,我在ApacheTomcat8中运行了一个示例SpringSecurity(HelloWorld)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"
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”所定义的通用日志格式相对应。Tomcat文档还说明:
%u-已通过身份验证的远程用户(如果有),否则“-”
我是否应该应用任何其他配置,以使用户在访问日志中可见?因为,它可能无法按预期工作
Tomcat的访问日志阀不起作用,因为Tomcat不知道Spring安全性,它完全在您的应用程序中运行
您可以使用过滤器:
最简单的选择是在Spring Security之后添加您自己的过滤器(例如在web.xml中),并转储您想要的信息
在其他解决方案中,您可能需要将用户名包含为会话属性
这可能是不够的,因为公共模式已包含%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请参阅我已经实现了自定义筛选器,并尝试通过%{username}在访问日志中打印它,并且它工作正常。我还尝试通过%reqAttribute{username}打印带有LogbackValve的日志,但它返回“-”。您知道如何在LogbackValve场景中获取用户名吗?@StiliyanVasilev我目前不知道know@StiliyanVasilev我想您可以问一个关于使用带有session属性的LogbackValve进行日志记录的新问题