[RESOLVIDO] Controle de acesso - Salvo no banco de dados [RESOLVIDO]

Isso o nome é esse.

Agora não entendi.

Tem como eu pegar a url que esta anotada @auditoria?

TIpo.

Incluir produtos.

@auditoria
@Post("produto/novo")
public void novo(produto){
dao.salva(produto);
}

Tem sim. O problema é que você não vai conseguir ver as variáveis na URL…

Além do problema de você ter mais de uma url para uma action. Você nunca vai saber qual o usuário está usando.

Então eu sugiro você usar o request mesmo.

Isso que eu disse é para você fazer isso:

Hum,

Entendi.

Mas eu preciso saber qual foi o metodo que a pessoa fez.
Não é um controlle de acesso.

Posso fazer duas, três … anotações.

Não vai contra o OO

Uma para inclusão.

@auditoria_inclusao

    req.getContextPath().replace("/compresempre", "Inclusao")  

Exclusão

@auditoria_exclusao

    req.getContextPath().replace("/compresempre", "Exclusão")  

Obrigado!

Ah, espera! :oops:

Usa esse cara aqui:

Você pode fazer uma anotação só e passar a funcionalidade como parâmetro…

Consegui!!!

// Metodo intercept - o que deve ser feito quando é encontrado a anotação
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {

		// Salvar no banco as informações
		Auditoria auditoria = new Auditoria();

		// Adiciona Id da empresa na sessão
		auditoria.setUsuario(empresa.getId());

		// Adiciona Nome do metodo
		String metodo = req.getMethod();
		if (metodo.equals("POST")) {
			auditoria.setMetodo("SALVAR");
		}
		if (metodo.equals("PUT")) {
			auditoria.setMetodo("EDITAR");
		}
		// Hora e data
		Date dataAtual = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		String dataStr = sdf.format(dataAtual);
		auditoria.setData(dataStr);

		Date horaAtual = new Date();
		SimpleDateFormat sdf2 = new SimpleDateFormat("hh:mm:ss");
		String horaStr = sdf2.format(horaAtual);
		auditoria.setHora(horaStr);

		// Salva no banco o objeto
		this.dao.salva(auditoria);

		// segue o curso padrão
		stack.next(method, resourceInstance);
	}

Fiz um if para testar o retorno, conforme o tipo do método eu sei se estar alterando ou removendo.
Agora, so falta colocar na tabela, o cod_produto. TInha esquecido. Mas agora está facil.
Valeu brother.

Tudo de bom!!!

Sugiro você trocar tudo isso:

        // Hora e data  
        Date dataAtual = new Date();  
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");  
        String dataStr = sdf.format(dataAtual);  
        auditoria.setData(dataStr);  
  
        Date horaAtual = new Date();  
        SimpleDateFormat sdf2 = new SimpleDateFormat("hh:mm:ss");  
        String horaStr = sdf2.format(horaAtual);  
        auditoria.setHora(horaStr);

Coloca essas instruções no seu construtor. Assim:

public Auditoria (){
    // Hora e data  
        Date dataAtual = new Date();  
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");  
        String dataStr = sdf.format(dataAtual);  
        this.setData(dataStr);  
  
        Date horaAtual = new Date();  
        SimpleDateFormat sdf2 = new SimpleDateFormat("hh:mm:ss");  
        String horaStr = sdf2.format(horaAtual);  
        this.setHora(horaStr);
}

Ok!
Valeus!

Brother,

Ainda não terminei aquela classe.

To querendo colocar o id do produto.

O que eu fiz.

Auditoria.

@Entity
public class Auditoria {

	// Variáveis
	@Id
	@GeneratedValue
	private Long id;
	private Long usuario;
	private String metodo;
	private Long produto;
	private String hora;
	private String data;
	
	//Construtor
	//Insere a hora e a data
	
    public Auditoria (){  
        // Hora e data    
            Date dataAtual = new Date();    
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");    
            String dataStr = sdf.format(dataAtual);    
            this.setData(dataStr);    
        
            Date horaAtual = new Date();    
            SimpleDateFormat sdf2 = new SimpleDateFormat("hh:mm:ss");    
            String horaStr = sdf2.format(horaAtual);    
            this.setHora(horaStr);  
    }  
	
	// Método set e get

	public Long getId() {
		return id;
	}

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

	public Long getUsuario() {
		return usuario;
	}

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

	public String getMetodo() {
		return metodo;
	}

	public void setMetodo(String metodo) {
		this.metodo = metodo;
	}

	public String getHora() {
		return hora;
	}

	public void setHora(String hora) {
		this.hora = hora;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public Long getProduto() {
		return produto;
	}

	public void setProduto(Long produto) {
		this.produto = produto;
	}
}

Como eu faço no interceptor, para pegar o id do produto?

Obrigado!

Como que você consegue pegar o produto?

Cara, Olha so.

Eu coloquei a interface audit.
Nesse metodo.

//Alteração - Gera a interface para alterar //Envia o ID para alterar @Audit @Put("/produtoEmpresa/{produtoEmpresa.id}") public void altera(final ProdutoEmpresa produtoEmpresa) { dao.atualiza(produtoEmpresa); //Redireciona para a listagem, após a inserção. result.redirectTo(this).lista(); }

Como funciona.

Eu tenho:

Empresa
Produto

ProdutoEmpresa
Onde a empresa escolhe o produto, e coloca o seu preço.

O que eu preciso e controllar quando a empresa fizer alguma alteração.

O que eu pensei…

Pegar a URL que está me enviando.
Com o código.

Tipo …

/produtoEmpresa/50

Tem como isso?

Porque ai, eu faria assim, se metodo igual a Put.
Salvaria no metodo - Alteração - /produtoEmpresa/50

Eu ja consigo o id da empresa, então já está bom.
Já dá pra fazer uma auditoria.
Valeus!

Eu ainda não entendi muito bem isso tudo…

Mas você pode pegar os últimos números da sua URL com RegEx…

Seguinte,

Eu preciso de um controlle de acesso.

Discutimos, e vimos que o melhor era, criar um interceptor, e uma anotação chamada @Audit.

Criei, com sua ajuda, pego o endereço da URL que está enviando. E salvo no banco de dados, o usuário e a URL.

Eu tenho três métodos, que precisam ser auditados.

2º Excluir - OK

Porque eu recebo a URL e o metodo que eu sei que está excluindo.

3º Alterar - OK

Porque eu recebo a URL e o metodo que eu sei que está alterando.

1º Salvar - Não OK!

  • Aqui não está ok, porque eu recebo somente o metodo POST, e a url do meu projeto.
    Eu preciso saber qual foi o id do produto que foi adicionado.

O que eu tentei fazer, que resolveria, mas está dando um erro.

for (ProdutoEmpresa s : dao2.listaTudo()) { Long ss = s.getId(); System.out.println("Número " + ss); ss += (long)1; System.out.println(" Novo " + ss); auditoria.setProduto(ss); }

Eu estou pegando o último Produto adicionado, e acrescentar + 1;

O problema, e que o hibernate, traz para mim a sessão, e não renova. Dessa forma, somente o primeiro fica correto, o restante que é adicionando não. Porque pega sempre o mesmo id.
Como eu resolvo isso?

Para salvar você precisa pegar o ID. Mas não tem como ter certeza se o registro foi salvo ou não. Certo?

O que eu faria:
Colocaria toda essa inteligência no interceptor DEPOIS do stack.next… Assim você estará interceptando o resultado da requisição.

Quando você fizer a alteração, envie para a tela o ID do objeto alterado (ou salvo) e assim você não precisa pegar na URL…

Agora sim!

rsrsrs.

Não estou entendo uma coisa, porque ele ta pegando o nome do metodo, sempre POST?

// Faz a ação no banco normalmente
		stack.next(method, resourceInstance);

		// Salvar no banco as informações
		Auditoria auditoria = new Auditoria();

		// Adiciona Id da empresa na sessão
		auditoria.setUsuario(empresa.getId());

		// Adiciona Nome do metodo
		String metodo = req.getMethod();
		if (metodo.equals("POST")) {
			auditoria.setMetodo("SALVAR");
		}
		if (metodo.equals("PUT")) {
			auditoria.setMetodo("EDITAR");
		}
		if (metodo.equals("DELETE")) {
			auditoria.setMetodo("REMOVER");
		}

		// Pega o ID do Produto
		auditoria.setProduto(produtoEmpresa.getSprodutoEmpresa().getProduto()
				.getId());

		// Hora e data
		// Construtor da classe

		// Salva no banco o objeto
		this.dao.salva(auditoria);

Fiz uma inclusão, alteração e removação.
Sempre vem SALVAR.
Salvar

Editar

Remover

Restante está perfeito!

Valeu brother.

Isso acontece porque as requisições PUT e DELETE são tratadas como POST e o VRaptor as redireciona para o método correto através da variável _METHOD…

Você pode fazer um req.getParameter("_METHOD") para saber se é put ou delete.

Esta vindo vazio.

System.out.println(req.getParameter("_METHOD"));

Console

null

Tem outro?

está indo vazio quando é POST(insert) ou em qualquer um dos casos?

Em todos.
Tem nada errado com a minha anotação?

//Disponivel em tempo de execução
@Retention(RetentionPolicy.RUNTIME)
//Anotação para métodos
@Target(ElementType.METHOD)
public @interface Audit{
}

Sua annotation está certa.

Debuga e olha os valores dentro do request para saber quais deles definem o método http que está sendo chamado pelo browser.

Esse method da sua annotation define que ela só pode anotar métodos.