在 Liferay 7 企业版中,
我想在每个请求中自动在外部日志文件中记录 user_name 之类的用户信息以跟踪用户活动,该怎么做?
不使用审计插件
例如,当我尝试记录发布请求(登录)时,它不包含有关用户的任何信息?!
在 Liferay 7 企业版中,
我想在每个请求中自动在外部日志文件中记录 user_name 之类的用户信息以跟踪用户活动,该怎么做?
不使用审计插件
例如,当我尝试记录发布请求(登录)时,它不包含有关用户的任何信息?!
这种事情比你想象的要困难得多……
访问当前用户非常容易。正如维克多所指出的,您可以使用 ThemeDisplay 对象来获取当前用户。如果周围没有请求,可以使用 PrincipalThreadLocal 查找当前用户 ID。
这给了你谁,但肯定不是“用户在做什么”方面。由于门户聚合了许多 portlet 的 HTML 片段,因此从 servlet 过滤器的角度来看,很难发现传入 URL 上的可用 portlet 中的哪一个实际上正在与之交互。您可以尝试使用 portlet 过滤器来缩小该字段的范围,但这只会告诉您正在访问什么 portlet,而不是他们正在使用它做什么。
尽管您拒绝了 DXP 中提供的内置审计功能,但它确实是跟踪谁在门户中做了什么的答案,因为它有必要的接触点来获取这两个部分并将它们组合在一起。
现在,如果您因为想要一个文件而不是数据库条目而拒绝了内置的审计功能,那很容易解决。转到系统设置控制面板并找到日志审核消息处理器并启用它。它将审计事件写入 CSV 格式的文件,但您应该有 modules/apps/foundation/portal-security-audit/portal-security-audit-router/src/main/java/com/liferay 的源/portal/security/audit/router/internal/LoggingAuditMessageProcessor.java 所以你可以以此为基础来编写你自己的格式。
这似乎是一个过滤器的工作,用户信息通常是从 themeDysplay 中提取的,例如:
ThemeDisplay themeDisplay = ( ThemeDisplay ) request.getAttribute( THEME_DISPLAY );
long userId = themeDisplay.getRealUserId();
如果您想跟踪特定的 portlet,OSGi portlet 过滤器就可以完成这项工作。
看看这段代码: https ://github.com/amusarra/liferay-portal-security-audit
特别是捕获登录事件的 portal-security-audit-capture-events 模块。