【问题标题】:Hibernate envers spring web app how to log usernameHibernate envers spring web app如何记录用户名
【发布时间】:2013-01-02 23:31:10
【问题描述】:

我正在使用 hiberbate 3.5 和 spring 3.x

我的环境正在工作,现在正在写入 ... _aud 和 revinfo 记录。

我现在需要将用户名添加到审计记录中,我猜 revinfo 是我见过的最好的地方,我看到了 seam 应用程序的例子,但 jboss 中的 spring 应用程序没有

谁能帮忙解决这个问题。

我的主要目标是能够记录 Windows 身份验证的用户。

【问题讨论】:

    标签: java spring hibernate jboss hibernate-envers


    【解决方案1】:

    如果您使用 Seam,请参阅 Envers 文档 has an answer

    public class ExampleListener implements RevisionListener {
        public void newRevision(Object revisionEntity) {
            ExampleRevEntity exampleRevEntity = (ExampleRevEntity) revisionEntity;
            Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity");
    
            exampleRevEntity.setUsername(identity.getUsername());
        }
    }
    

    所以,我想您的问题是如果您不使用 Seam,那么如何在此时检索当前登录的用户?我敢肯定有几种方法可以做到,我们就是这样做的。

    • Write a ServletFilter
    • 在过滤器中从会话中获取主体(如果您使用 Spring Security 等安全框架,则获取安全上下文)
    • 将其存储在log4j MDC

    过滤器中的代码示例

    protected void beforeRequest(final HttpServletRequest request, final String message) {
      final Principal principal = request.getUserPrincipal();
      final String username = principal != null ? principal.getName() : null;
      if (username != null) {
        MDC.put(USER, username);
      }
    }
    protected void afterRequest(final HttpServletRequest request, final String message) {
      MDC.remove(USER);
    }
    

    稍后您可以从代码中的任何位置获取用户,因为 MDC 有一个静态的 get(String) 方法。

    【讨论】:

    • 这真的很有帮助@Marcel Stör。你是对的,我正在尝试为 wep 应用程序和 Web 服务执行此操作。但我有点迷失的是,我如何让 ExampleListener 工作,并与我的 EntityManager.persist() 调用链接?
    • 您是否按照我链接到的 Envers 文档中的章节进行操作?它声称“Envers 提供了一种简单的方法来记录每个版本的附加数据。”所以我想你应该从那里开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多