31 ago 2016

Auditoria de dados com Spring Data JPA.

O Spring Data JPA fornece de forma muito fácil uma auditoria de quem criou ou editou uma entidade e quando essas alterações aconteceram.

É somente necessário alterar sua classe de entidade, para suportar essa auditoria, isso pode ser feito por anotação ou implementando uma interface.

Caso opte por utilizar anotações, essas são as seguintes anotações suportadas:

@CreatedBy: Serve para identificar quem criou o registro.

@CreatedDate: Serve para marcar quando foi criado o registro.

@LastModifiedBy: Serve para identificar quem fez a última alteração no registro.

@LastModifiedDate: Serve para marcar quando foi feito a última atualização no registro.

Quando você utiliza as anotações @CreatedBy ou @LastModifiedBy, é necessário informar para a aplicação quem é o usuário autenticado. Para isso é necessário criar uma classe que implemente a interface AuditorAware, o tipo generico T representa o tipo da propriedade que foi anotada na classe de entidade.

Caso a escolha seja utilizar interface, sua classe de entidade deve implementar a interface Auditable, e deve ser implementados os metodos getters e setters das propriedades que estão sendo auditadas. Existe também uma classe AbstractAuditable que pode ser extendida para evitar a implementação dos metodos na classe. O problema de utilizar esse metodo, é que as classes de entidades são alteradas, aumentado o acoplamento, por isso é recomendado utilizar a auditoria por anotações.

Exemplo de uma classe que implementa a interface AuditorAware baseada no Spring Security:


public class SpringSecurityAuditorAware implements AuditorAware<User> {

@Override
public User getCurrentAuditor() {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

if (authentication == null || !authentication.isAuthenticated()) {
return null;
}

return ((UserAuditDetails) authentication.getDetails()).getUser();
}

}

Para habilitar a auditoria via configuração de classse, é necessário utilizar a anotação @EnableJpaAuditing e criar um @Bean da classe que implementa a interface AuditorAware.

Exemplo de classe de configuração:


@SpringBootApplication
@EnableJpaAuditing
public class SpringDataJpaAuditDemoApplication {

public static void main(String[] args) {
SpringApplication.run(SpringDataJpaAuditDemoApplication.class, args);
}

@Bean
public AuditorAware<User> auditorProvider(){
return new SpringSecurityAuditorAware();
}

}

Você pode encontrar mais informações na documenteção oficial do spring data.

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#auditing

Link do bitbucket com um projeto de exemplo:

https://bitbucket.org/cgferreira87/springdataaudit

Dúvidas ou sugestões, por favor deixe um comentário, espero que tenham gostado e até o próximo post.

 

Comments

  • Kin.LHP
    julho 15, 2017 Responder

    Boa noite Caio, tudo certo contigo?
    Cara, me tire uma dúvida: na implementação da interface AuditorAware, o tipo deve ser um T que implementa UserDetails?
    Porque aqui não funcionou passando os headers Last-Modified ou If-Modified-Since na requisição GET.

Leave a Comment