如何使用Revision Listener在审核中设置用户

时间:2017-12-19 13:17:33

标签: java spring hibernate hibernate-envers

我正在申请中实施审核。到目前为止,我已经成功地记录了审计表中的活动和记录。问题是我无法实现用户。 我在很多地方研究过,我知道这很简单,也许我只是看不到什么东西,此时你可以帮助我。 我正在使用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.
    }




}

1 个答案:

答案 0 :(得分: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);
    }
}