【问题标题】:How to set user in audit using Revision Listener如何使用修订侦听器将用户设置为审核
【发布时间】:2017-12-19 13:17:32
【问题描述】:

我正在我的应用程序中实施审核。到目前为止,我已经成功地在审计表中记录了活动和记录。问题是我无法实现用户。 我研究了很多地方,我知道这很简单,也许我只是没有看到一些东西,此时你可以帮助我。 我正在使用 Hibernate Envers 和 Revision Entity 类 我正在使用 Spring Boot。

这是我获得用户的课程

@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.
    }




}

【问题讨论】:

    标签: java spring hibernate hibernate-envers


    【解决方案1】:

    是的,这正是您必须设置要审核的用户信息的地方。此信息可以从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);
        }
    }
    

    【讨论】:

    • 是的.. 但是要使用SecurityContextHolder 我需要导入一些库吗?这是我看不懂的部分。
    • 这是 Spring Security 的一个类,其中存储了有关当前登录用户的信息。你在哪里有用户名信息?
    • Fwiw,Hibernate Envers 5.3 将支持依赖注入到您的修订监听器中,因此您将能够注入 CDI bean 并且 Spring 计划从 Spring 5.1 开始支持这种注入。
    • @lzagkaretos eu não uso a segurança Spring, acabei de passar o nome do usuário por token .. veja a classe LoginController
    • 对不起...我不使用 Spring 安全性我只是通过令牌传递用户查看类 LoginController
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2013-07-27
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多