Filter para níveis de permissão

8 respostas
asandrob

Bom dia pessoal.
Tenho uma questão que provavelmente alguém já passou por ela.
O sistema terá que controlar dados de N filiais, e os usuários poderão fazer consultas nestes dados.
Porém o usuário1 pode apenas consultar a filial1, por outro lado o usuário2 por consultar a filial2 e filial3.
Notem que os dois usuários terão acesso a página de consulta, mas com nível de permissão restrito.
Eu estava pensando em implementar isso com o Filter

Alguém pode me dar um norte?

Valew.

8 Respostas

Hebert_Coelho

Se você implementar isso por filter, você vai ter que realizar a consulta por filtro… Eu não vejo como você faria isso…

Já pensou na possibilidade de ter EAR/WARs distintos? Um artefato para cada filial?

Ficaria algo do tipo: www.minhamepresa.com/filialA www.minhamepresa.com/filialB


Você também poderia ter vários datasource/persistence-units na mesma aplicação (artefato único).

Antes de realizar uma consulta ou coisa do tipo, seria verificado qual a filial do cara. Seria algo do tipo:
DS ds = getUsuarioDataSource(user.getFilial());
ds… e assim vai.

O método getUsuarioDataSource teria algo do tipo:
if filial.equals(EMREPSA_A) return dsA

lele_vader

Com filter acho que não dá não, pois ambos terão acesso a página.
Acho que vai ter que ser antes de entrar na tela você vai ter que ver o nível do usuário logado e somente trazer as filiais relacionadas a ele.

WRYEL

Que tal analisarmos seu problema em mais alto nível ? :slight_smile: vamos lá …

Estou partindo do pressuposto que você já tem as permissões cadastradas em seu banco de dados, seu método poderia ser:

public List<Filial> UsuarioService.getFiliaisPorPermissaoDeConsulta(Usuario usuario);

ou

public List<Filial> UsuarioService.getFiliaisPorPermissaoDeConsulta(Usuario usuario, Set<Permissao> permissoes);

Destacando que seu Filial pode ser um proxie, ejb ou um objeto remoto qualquer. Considere ler depois sobre o design pattern Service Locator também, pode ser que ele te ajude.

asandrob

Estava pensando…
E se eu carregar um atributo de sessão (“where filial in '1;2;3”) junto com o objeto user.
Esse “where” seria contruído no login do usuário, e seria utilizado nas rotinas dos DAO’s.

lele_vader

A tabela de usuário não tem o nível dele não ?
Ou pelo menos se relaciona com essa tabela ?
Porque daí seria pegar o nível do cara e filtrar lá na visualização das filiais.

asandrob

lele_vader:
A tabela de usuário não tem o nível dele não ?
Ou pelo menos se relaciona com essa tabela ?
Porque daí seria pegar o nível do cara e filtrar lá na visualização das filiais.

Exato, é isso que eu quero fazer, mas tens alguma sugestão de implementação?

lele_vader

Passe o usuário logado para um objeto de sessão, isso juntamente com o seu nível.
No seu método que lista as filiais você passa o seu usuário.

Na sua consulta se estiver usando jpa, você pode usar criteria para listar as filiais dependendo do nível ou usar um or com jqpl.

asandrob

lele_vader:
Passe o usuário logado para um objeto de sessão, isso juntamente com o seu nível.
No seu método que lista as filiais você passa o seu usuário.

Na sua consulta se estiver usando jpa, você pode usar criteria para listar as filiais dependendo do nível ou usar um or com jqpl.

OK, tentarei implementar como o sugerido, até pq foi ± assim que eu pensei.
Valew galera…

Criado 28 de setembro de 2012
Ultima resposta 28 de set. de 2012
Respostas 8
Participantes 4