2017-12-19 10 views
0

내 응용 프로그램에서 감사를 구현 중입니다. 지금까지 나는 감사 테이블에 활동과 레코드를 기록하는 데 성공했습니다. 문제는 내가 사용자를 구현할 수 없다는 것입니다. 여러 곳에서 연구했는데, 간단하다는 것을 압니다. 아마도 뭔가를 보지 못했을 수도 있습니다. 그리고이 시점에서 저를 도울 수 있습니다. Spring 부팅을 사용하여 최대 절전 모드 Envers와 개정 엔터티 클래스 을 사용하고 있습니다. 리비전 리스너를 사용하여 감사에서 사용자를 설정하는 방법

내가 사용자에게 얻을 나의 클래스입니다

@RestController 
public class LoginController { 

    @Autowired 
    UsuariosService uService; 

    @Autowired 
    PermissoesPaginasService ppService; 

    @Autowired 
    EntidadesAdministradoresService eaService; 

    @Autowired 
    UsuariosService usuariosService; 

    @RequestMapping(value = "/autenticar", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.POST) 
    public LoginResponse autenticar(@RequestBody Usuarios usuarios) 
      throws ServletException { 

     // verifica se foram digitados o login e senha no front end 
     if (usuarios.getLogin() == null 
       || usuarios.getSenha() == null) { 
      throw new ServletException("Nome ou senha obrigatório"); 

     } 

     // busca no banco de dados 
     Usuarios usuariosAutenticado = uService.buscarPorLogin(usuarios.getLogin()); 


     if (usuariosAutenticado == null) { 
      return new LoginResponse("naoEncontrado"); 
     } 


     // compara a senha vinda do banco de dados com a senha vinda da tela 
     if (!usuariosAutenticado.getSenha() 
       .equals(usuarios.getSenha())) { 
      return new LoginResponse("senhaInvalida"); 
     } 

     String token = Jwts.builder().setSubject(usuariosAutenticado.getLogin()) 
       .signWith(SignatureAlgorithm.HS512, "digi2fred") 
       .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000)).compact(); 



     return new LoginResponse(token); 
    } 


    private class LoginResponse { 
     public String token; 

     public LoginResponse(String token) { 
      this.token = token; 

     } 

     public String getToken() { 
      return token; 
     } 

    } 
} 

내 클래스 UsuarioRevEntity

@Entity 
@Table(name = "usuario_rev_entity", schema = "aud") 
@RevisionEntity(UsuarioListener.class) 
public class UsuarioRevEntity { 

     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     @RevisionNumber 
     private int id; 

     @RevisionTimestamp 
     private long timestamp; 

     private String usuario; 



     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

     public long getTimestamp() { 
      return timestamp; 
     } 

     public void setTimestamp(long timestamp) { 
      this.timestamp = timestamp; 
     } 

     public String getUsuario() { 
      return usuario; 
     } 

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


} 

및 UsuarioListener 당신이 사용자 정보를 설정해야 할 경우

public class UsuarioListener implements RevisionListener { 


    public void newRevision(Object revisionEntity) { 
     UsuarioRevEntity usuarioRevEntity = (UsuarioRevEntity) revisionEntity; 

    // i guess that here i need to pass user log. 
    } 




} 

답변

0

예이 정확히 감사를받습니다. 이 정보는 SecurityContextHolder에서 추출 할 수 있으며 username을받는 방법은 명시 적 구현에 따라 다릅니다.

public class UsuarioListener implements RevisionListener { 

    @Override 
    public void newRevision(Object revisionEntity) { 

     // Get username from SecurityContextHolder 
     // SecurityContextHolder.getContext().getAuthentication(); 
     String usuario = ... 

     UsuarioRevEntity usuarioRevEntity = (UsuarioRevEntity) revisionEntity; 
     usuarioRevEntity.setUsuario(usuario); 
    } 
} 
+0

예. 그렇지만'SecurityContextHolder'를 사용하려면 라이브러리를 구현해야합니까? 이것은 내가 이해할 수없는 부분입니다. –

+0

이것은 현재 로그인 한 사용자에 대한 정보가 저장되는 Spring Security의 클래스입니다. 사용자 이름 정보는 어디에 있습니까? – lzagkaretos

+1

Fwiw, Hibernate Envers 5.3은 개정판 청취자에 대한 의존성 주입을 지원하므로 CDI 빈과 스프링 5.1을 주입하기위한 스프링 계획을 주입 할 수 있습니다. – Naros