Hibernate使春季网络应用程序如何记录用户名

时间:2013-01-02 23:31:10

标签: java spring hibernate jboss hibernate-envers

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

我有envers工作,现在正在写_aud和revinfo记录。

我现在需要将用户名添加到审计记录中我猜测revinfo是我见过的最好的地方,我看到了一个关于缝应用程序的例子,但jboss中没有春季应用程序

请有人帮忙解决这个问题。

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

1 个答案:

答案 0 :(得分:3)

如果您使用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)方法。