带有嵌入式tomcat的Spring Boot +带有身份验证用户的访问日志

Posted

技术标签:

【中文标题】带有嵌入式tomcat的Spring Boot +带有身份验证用户的访问日志【英文标题】:Spring boot with embedded tomcat + access log with authentication user 【发布时间】:2017-07-02 09:55:30 【问题描述】:

我正在使用带有嵌入式 tomcat + spring security 的 spring boot。 我从tomcat的访问日志看起来是这样的

IP - - [14/Feb/2017:08:49:50 +0200] "GET /page/2 HTTP/1.1" 200 2606

那么,我怎样才能使日志文件看起来像

IP - - [14/Feb/2017:08:49:50 +0200] 用户名 - "GET /page/2 HTTP/1.1" 200 2606

每个请求都必须具有发出请求的用户名。对于安全认证,我使用带有数据库用户名和密码信息的 spring security。

【问题讨论】:

好问题,顺便说一句 【参考方案1】:

您可能需要将应用程序属性中的access log pattern 更改为如下内容:

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

其中%u已通过身份验证的远程用户(参见示例here)。


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

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

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

    在访问日志模式中添加以下参数:%usernames

    server.tomcat.accesslog.pattern=%h %l %t %u %usernames "%r" %s %b

它应该从HttpSession 中获取名为username 的属性,因为它描述了here。

【讨论】:

如何使用此解决方案处理 STATELESS 会话策略?有什么想法吗? 如果添加到请求过滤器(前 jwt 验证器)中,上述方法似乎也适用于无状态。或者,您可以在请求中设置属性,如 request.setAttribute("username", user.getName()); 并使用 %usernamer

以上是关于带有嵌入式tomcat的Spring Boot +带有身份验证用户的访问日志的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌入式 Tomcat 的 Spring Boot 忽略了方法角色

使用带有嵌入式 Tomcat 的 Spring Boot Weblfux

如何在带有嵌入式 tomcat 的 Spring Boot App 中设置域名

带有嵌入式tomcat的Spring Boot应用程序,将访问日志发送到syslog

如何在带有嵌入式 tomcat 的 Spring Boot 应用程序中运行 hawt.io

运行带有 SSL 和同时未加密的 Spring Boot 应用程序(嵌入式 Tomcat)