Prezados estou com o seguinte problema:
Preciso criar um módulo acoplável a determinadas aplicações que fazem pesquisa na base de dados. Esse módulo deverá filtrar as consultas limitando ao usuário enxergar os registros que ele tem permissão de acesso.
Ex.: Pesquisa por documento
Perfil 1 = só acessa os documentos criados por ele.
Perfil 2 = acessa seus documentos e os de seus funcionários
Perfil 3 = acessa todos os documentos da regional
Perfil 4 = acessa todos os documentos…
Possibilidade1: Interceptor
Usar um interceptor para capturar o SQL gerado pelo hibernate e alterá-lo de forma a contemplar a regra de negocio em questão.
Ex. de alteração no sql: “select * from (SQL DO HIBERNATE) as xpto where FILTRO DINAMICO”
Problemas:
- meu filtro de pesquisa sempre tem que estar na consulta gerada pelo hibernate.
- como poderei identificar as buscas que devem ou não passar por esse filtro (nem toda busca do sistema usa esse filtro)
- perda de desempenho para analisar e modificar o SQL do hibernate
Possibilidade2: usar algum recurso do hibernate semelhante filtros que funcione de forma dinâmica, me permitindo definir a regra do filtro em tempo de execução.
Probelmas: não conheço nenhum recurso do hibernate que me permita fazer isso…rs
Desde já agradeço e aceito sugestões para resolver este problema… rsrs
[quote=pcnandes]Possibilidade2: usar algum recurso do hibernate semelhante filtros que funcione de forma dinâmica, me permitindo definir a regra do filtro em tempo de execução.
Probelmas: não conheço nenhum recurso do hibernate que me permita fazer isso…rs[/quote]
Não conhece a API de Criteria?
tnaires, meu problema vai um pouco além disso… Eu preciso criar um módulo que faça isso independente do tipo de consulta feita pelo desenvolvedor… O desenvolvedor pode fazer suas consultas em hql, criteria, filtro ou até mesmo sql. e esse módulo mágico tem que incluir essa restrição na consulta dele… sacou? Por isso que estou tentando fazer com interceptor, pois com ele eu capturo o sql gerado pelo hibernate, mas alterar esse sql eh complicado e custoso para minha aplicação.
Pensei em fazer alguma coisa semelhante a anotação @Where(clause = “idUsuario=x”), mas preciso incluir essa expressão dinamicamente em tempo de execução entendeu? não sei como poderia fazer algo do tipo… 
Fala ai pessoal boa noite a todos !
Tive lendo sobre o Spring ele fala sobre interceptadores que são configurados em um xml.
esses interceptadores são disparados por classes e por métodos.
Sendo assim pode criar um interceptador dentro dos Dao`s ai vc insere alguns criterios e seja feliz !
Bom teoricamente e isso ai !
Mais como fazer na pratica eu nao sei !
Procura algo sobre Spring nesse modulo de interceptors !
Ajudou?
Valeussss !!!
Fala ae magnocosta, obrigado pela dica, dei uma olhada por alto e aparentemente teria como acionar um interceptor em um método (tenho que ver melhor como isso funciona), mas como eu poderia adicionar os critérios pelo interceptor? e se meu método fizer uma consulta por hql?
ex1.:
public List listar() {
return findHQL(“from Agencia order by numero”);
}
ex2.:
public PagedResult consultarPaginado(Long numero) {
return findCriteria(
HibernateUtil.getInstance().getSession().createCriteria(Agencia.class).
add(Restrictions.eq(“numero”, numero)), new Page(1));
}
obrigado.
pcnandes,
Como ja havia dito nao conheco Spring ainda estou estudando ele e nunca trabalhei com ele.
Bom mais pensei em uma gambi aki sinistra !
Testa ai para ver c funciona.
seu dao ficaria assim:
[code]
public class Dao {
public static Criteria criteria;
public List consultar(){
criteria = HibernateUtil.getInstance().getSession().createCriteria(Agencia.class);
criteria.add(Restrictions.eq(“numero”, numero));
//O interceptador deve executar aqui
criteria.list();
}
}[/code]
E na sua classe interceptor ficaria assim:
public class interceptor{
public void intercptarConculta(){
Criteria c = Dao.criteria;
//Aki vc cria as restricoes que serao abstraidas
c.addRestrictions(Restrictions.eq("acesso", 10)));
Dao.criteria = criteria;
}
}
Cara ta ai nao sei t dar certeza c vai funcionar, to na faculdade e to sem tempo para testar.
Agora tem que desenrolar no Spring para ele invocar a classe interceptarConsulta no método da classe Dao.
Obs: Se for possivel fazer isso com Spring, realmente ele eh sinistro.
Se der certo posta ai p galera !
Valewwsss !