Envers - Guardar usuário na tabela auditada

3 respostas
Quindin

Boa tarde galera

Estou usando o envers para fazer a auditoria do sistema da empresa.
Hoje tenho a seguinte estrutura

@Audited
@Entity
@Table(name = "CLIENTE")
public class Cliente implements Serializable {

//propriedades

}

Um RevisionListener para add o usuário

public class AuditoriaListener implements RevisionListener{

    @Override
    public void newRevision(Object revisionEntity){
        RevisionEntityWeb entity = (RevisionEntityWeb) revisionEntity;
		Usuario usuario = (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        entity.setUsuario(usuario.getCodigo().toString());
    }
}

E uma entidade de revisao

@Entity
@Table(name = "REVISION_ENTITY")
@RevisionEntity(AuditoriaListener.class)
public class RevisionEntityWeb extends DefaultRevisionEntity {

    private static final long serialVersionUID = 1L;

    private String usuario;

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
}

Eu Gostaria que no lugar de gravar o usuário numa segunda tabela (REVISION_ENTITY)..
guardasse as informações na mesma tabela auditada no caso CLIENTE_AUD e não na REVISION_ENTITY
Pois a REVISION_ENTITY vai crescer muito pois muitas tabelas de grande porte são auditadas

Outra coisa tambem é mudar para ficar num banco a parte.. e não no mesmo bando da app

3 Respostas

R

Também gostaria de saber se pode botar o usuário que fez a alteração na tabela auditada, no seu caso CLIENTE_AUD.

Alguém pode ajudar?

Hebert_Coelho

Automaticamente não conheço um modo de fazer isso. Talvez se ele tiver acesso direto a JAAS, mas isso é só um chute.

O que faria seria algo como (na Entity):
public class Customer {
	private String updatedBy;

	@PreUpdate
	private preUpdate() {
		updatedBy = MDC.get("CURRENT_USER");
	}	
}
E no controller:
MDC.put("CURRENT_USER", session.get("USER"));

O MDC é uma classe que segura informações de modo "global" na thread, assim você consegue acessar informações que forem colocadas em outras camadas.

R

Fala galera! Demorou mas saiu. Eu resolvi este problema quando implementei minha camada de segurança com Shiro. Apos fazer todas as configurações do Shiro e ajustar o Hibernate Envers, adicionei o descrito abaixo para armazenar o usuário logado na aplicação nas tabelas de auditoria.

public class AuditoriaListener implements RevisionListener, Serializable {

	private static final long serialVersionUID = 1L;
	
	@Override
	public void newRevision(Object object) {
		Subject currentUser = SecurityUtils.getSubject();
		AuditoriaRevisao auditoriaRevisao = (AuditoriaRevisao) object;
		auditoriaRevisao.setLogin(currentUser.getPrincipal().toString());
	}

}

Espero ter ajudado. Abração.

Criado 13 de setembro de 2012
Ultima resposta 26 de ago. de 2015
Respostas 3
Participantes 3