2017-12-19 6 views
0

私は自分のアプリケーションで監査を実装しています。これまでのところ、私は活動と記録を監査表に記録するのに成功しました。問題は私がユーザーを実装することができないということです。 私は多くの場所で研究しましたが、私はそれが簡単であることを知っています。何かが見えないかもしれない、そしてこの時点で私を助けることができます。 私はHibernate EnversとRevision Entityクラス を使用しています。私はSpringブートを使用しています。リビジョンリスナーを使用して監査でユーザーを設定する方法

これは私がユーザー

@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 BeanとSpring 5.1を使用してこの注入をサポートするSpringプランを注入できます。 – Naros

関連する問題