Controle de acesso utilizando JSP com JSF

1,215 views
Skip to first unread message

Anildo Mohamed

unread,
Nov 9, 2009, 7:46:25 AM11/9/09
to javasf: JavaServer Faces International Group
Oi pessoal,
Estou criando mais um "sistema de controle de acesso" á páginas
restritas, usando jsf. Quanto ao controle pelo arquivo web.xml (criei
um filtro login) já está ok
porém os operadores que logan no sistema possuem acessos diferentes,
mas até o momento acessam qualquer página. Já criei o cadastro de
permissoes para estes usuários. O que eu preciso saber é : Estou
tentando incluir tags <% %> ( jsp) para verificar se o usuário tem
permissão ou não. Porém não consigo fazer com que estas tags funcionem
unindo JSP com JSF. Sei que é possível fazer isto utilizando sessão ao
instânciar o controlador (ManagedBean) + estou querendo tratar isto
sem ter que instanciar esta classe.

Alguém pode me dar uma dica !?

Bruno Maomeh

unread,
Nov 9, 2009, 8:32:18 AM11/9/09
to jav...@googlegroups.com
procure pelo atributo rendered.. vc irá renderizar partes da página, dependendo do usuário..

2009/11/9 Anildo Mohamed <anildo...@gmail.com>



--
Bruno Maomeh
  http://brunomaomeh.wordpress.com

Bruno Maomeh

unread,
Nov 9, 2009, 8:32:36 AM11/9/09
to jav...@googlegroups.com
outra dica é trocar jsp pelo facelets.. :)

2009/11/9 Bruno Maomeh <bruno...@gmail.com>

Anildo Junior

unread,
Nov 9, 2009, 8:44:01 AM11/9/09
to jav...@googlegroups.com
Pois bem Bruno, quanto a renderização não tenho problemas. Quanto as tags, não faço questão que seja jsp, + seria uma boa se fosse facelets. Poderia me dar algum exemplo ? Pois na minha sessão, já tenho uma lista de permissoes do "cidadão" , daí como faço pra pegar estes valores usando facelets ?

Obrigado.

2009/11/9 Bruno Maomeh <bruno...@gmail.com>



--
--
Att,
Anildo Fernandes Costa Júnior
Grupo GojavaMe - http://groups.google.com.br/group/goj2me
Grupo Gojava - http://br.groups.yahoo.com/group/GOJava/
Programador Java - UEG-GOIÁS
Fone: (62) 9191-9423*

Bruno Maomeh

unread,
Nov 9, 2009, 8:56:58 AM11/9/09
to jav...@googlegroups.com
primeiro vc deve configurar sua aplicação pra rodar com o facelets.. e não com jsp..
na internet vc encontra isso fácil..
e pra pegar as permissões do cidadão.. EL do faces resolve o seu problema..

2009/11/9 Anildo Junior <anildo...@gmail.com>

Joel Amálio

unread,
Nov 9, 2009, 8:50:32 AM11/9/09
to jav...@googlegroups.com
Facelets é para uso exclusivo de template...

tipo o Tiles para o struts...

não é usado para controle de sessão

2009/11/9 Anildo Junior <anildo...@gmail.com>



--
Joel Amálio
Analista Desenvolvedor
Bacharel em Ciência da Computação
Celular: +55 71 8176-0771

José Barros

unread,
Nov 9, 2009, 8:46:53 AM11/9/09
to jav...@googlegroups.com
Usa Assim:

rendered="#{rich:isUserInRole('ROLE_USUARIO,ROLE_ADMIN,ROLE_OUTRO_PAPEL')}


--
José de Sousa Barros
Bacharel em Sistemas de Informação
Sun Certified Java 2 Programmer 5.0
Oracle Certified Associate AS 10g

Crê no Senhor Jesus Cristo e serás salvo, tu e a tua casa. (Atos 16 : 31)


2009/11/9 Bruno Maomeh <bruno...@gmail.com>

Assis Júnior

unread,
Nov 9, 2009, 10:55:03 AM11/9/09
to jav...@googlegroups.com
Kra, verifica o spring-security ou jboss-seam. Eles já implementam
segurança, vc não precisará reescrever código.

http://static.springsource.org/spring-security/site/
http://www.seamframework.org/

2009/11/9 José Barros <caia...@gmail.com>:
--
Atenciosamente,
Assis júnior
SCJP 5.0 Certified

Anildo Junior

unread,
Nov 9, 2009, 10:44:59 AM11/9/09
to jav...@googlegroups.com
José valeu pela resposta mas ...
        Estou utilizando tamplates, porém em relação aos níveis de usuário NÃO existe, papeis* ( administrador,supervisor etc...), contudo o cadastro de permissões que foi criado, grava no banco as informações de acesso ( Ex: Menu principal, Cadastro de Operador, Importação de arquivos, Relatorios) para cada usuário. Com isto o meu filtro Login identifica o usuário e busca esta lista de permissão do BD e grava na sessão.

Daí preciso de algo pareciso com a tag abaixo:

rendered="#{ if (objetoSessao.possuiPemissao) "carregaPaginaAtual" else forward="paginaAnterior.jsf" }"

( obvio que é só pra dar uma idéia pq isso não existe)


Obrigado



2009/11/9 José Barros <caia...@gmail.com>

Bruno Maomeh

unread,
Nov 9, 2009, 12:00:09 PM11/9/09
to jav...@googlegroups.com
<h:panelGroup rendered=#{teuBean.usuarioTipo1}><!-- tela do usuario tipo 1--></h:panelGroup>
<h:panelGroup rendered=#{teuBean.usuarioTipo2}><!-- tela do usuario tipo 2--></h:panelGroup>

2009/11/9 Anildo Junior <anildo...@gmail.com>

Davinir F Campos Jr

unread,
Nov 9, 2009, 12:04:36 PM11/9/09
to jav...@googlegroups.com
Então não é no rendered né... O rendered é para componente...
Se vc quer um comportamento como esse, provavelmente isso estará implementado no seu menu, imagino (por causa do carregaPaginaAtual e do paginaAnterior).
É isso?
Toma só cuidado pra não ficar misturando Service Layer com Presentation Layer, tenho visto muito isso.

[ ]s
Davinir

2009/11/9 Anildo Junior <anildo...@gmail.com>

Anildo Junior

unread,
Nov 9, 2009, 12:31:02 PM11/9/09
to jav...@googlegroups.com
Galera,
        Aí que tá estou fazendo de tudo pra não ( misturar as camadas). Meu usuário se identifica no sistema, e o controle gera uma página com os menus visíveis para ele acessar. Agora o problema é que se o usuário digitar a url no navegador, ele consegue acessar a página restrita. Infelizmente este está sendo o preço pago por não existir FUNÇÕES (ADMIN,SUPERVISOR, ETC...) devido a este motivo não estou usando spring-securiti pois nõa tenho "níveis de usuário".
        Tenho 10 páginas, disponíveis para navegação. Como eu faria para criar um filtro para navegação via aplicação e BLOQUEAR acesso direto via URL?

Obrigado.

2009/11/9 Davinir F Campos Jr <davin...@gmail.com>

Davinir F Campos Jr

unread,
Nov 9, 2009, 1:16:39 PM11/9/09
to jav...@googlegroups.com
Pessoal com mania de complicar ao invés de simplificar hein !!! :-D

Suas informações de usuário ficam em um bean com escopo de sessão? Se sim, sei lá, que tal um filter global?

Dê preferência para frameworks maduros, não invista seu tempo reinventando a roda. Provavelmente você acabará com um monte de outros security holes aí na sua aplicação...  MEDO !!! :-)

Seu sistema não faz uso de ROLES? Quer dizer, cada usuário tem suas autorizações setadas individualmente? Nada contra, isso pode até ser básico pra 5 users (um sisteminha que fiz pra 5 users em Delphi *tinha*), mas e 10? E 20? E 50? E se acrescentarem 5 páginas? Ou mais 10 páginas? E a rotatividade de funcionários? É, daí complica, vc perde a escalabilidade de sua aplicação já no nível do negócio...

Daniel Camargo

unread,
Nov 9, 2009, 2:53:59 PM11/9/09
to jav...@googlegroups.com
O mais incrível é que ainda não compreendi com clareza o problema que você descreveu.

O que eu entendi é que você precisa proteger o acesso a URLs e blocos de página dependendo do papel (ou ator do caso de uso), correto?

Quando o usuário loga no sistema você consulta uma tabela para resgatar todos os papeis que esse usuário tem, correto?

No seu lugar eu usaria o Realm ou o Jaas para fazer a autenticação pois eles já estão prontos e funcionam muito bem. Se você tiver tempo pra gastar querendo implementar o mecanismo na mão vai em frente, mas usar um Realm da vida é mais fácil e tem muitas vantagens.

Quando você loga pelo Realm você pode usar o facesContext.getExternalContext().isUserInRole("ADMIN") para saber se o usuário está no login correto.

Se você estiver usando facelets (que eu também recomendo) você pode até criar uma função ou um componente para fazer isso automático ou usar algum pronto. Dessa forma você pode proteger a URL pelo web.xml da forma padrão com o uso de security-constraints e usar função/componente para proteger os blocos tipo:

<app:renderIfUserInRole roles="ADMIN, STAFF">
   <h:form>
      <h:commandButton ...>
      <!-- o resto do bloco aqui -->
</app:renderIfUserInRole>

ou:

<h:commandButton rendered="#{app:isUserInRole('ADMIN, STAFF')}" ...

ou:
<c:if test="#{app:isUserInRole('ADMIN, STAFF')}">
<!-- seu bloco aqui -->
</c:if>

Em fim, tem opções diferentes.

Anildo Junior

unread,
Nov 9, 2009, 7:07:45 PM11/9/09
to jav...@googlegroups.com
Ok vamos lá :
1)Suas informações de usuário ficam em um bean com escopo de sessão? Se sim, sei lá, que tal um filter global?
   Tenho sim um bean com escopo de sessão, e junto a ele uma lista de permissoes deste usuário.
 
2)O que eu entendi é que você precisa proteger o acesso a URLs e blocos de página dependendo do papel (ou ator do caso de uso), correto?
    Correto. Pois se não conseguir bloquear o acesso direto da URL o usuário após logado* poderá acessar qualquer página ( daí é mato*)
 
3)Realmente eu também acredito que vc não entendeu completamente meu problema. Mas achei muito pertinente sua resposta quanto á "reinventar a roda" , também não concordo em reinventar, e até que seria interessante utilizar o Realm para rverificar se o "perfil" do usuário era "supervisor, admin, e coisa e tal", mas como a situação é atipica, em algum momento terei um usuário que irá possuir acesso variado em diversos menus ( ações ). Exemplo em um sistema de automação comercial vc possui uns 30 módulos, cada qual com suas funções (financeiro, faturamento, cadastro, compras etc..) porém cada operador terá seu tipo de acesso, alguns somente faturamento, outros cadastro de produtos e outros pagamento de contas, notou que todos que eu sitei são operadores, porém com acessos diferentes.( percebeu !? "aki que o bicho pega rs").
 
 
Desde já abradeço a todas as respostas

2009/11/9 Daniel Camargo <danie...@gmail.com>

Davinir F Campos Jr

unread,
Nov 9, 2009, 8:02:21 PM11/9/09
to jav...@googlegroups.com
1 e 2) E o usuário não faz nada se não tiver logado? Se um guest não acessa nada no seu sistema, o filter pode redirecionar sessões guest para a página de login, sem problemas.

3) Não sei se enquadra-se melhor aqui um filter ou um phase-listener ou ambos... :-) Pelo filter vc tem o alvo do request, pode verificar na lista de permissões...

[ ]s
Davinir

2) Sim, com o filter vc pode redirecionar usuários

2009/11/9 Anildo Junior <anildo...@gmail.com>

Assis Júnior

unread,
Nov 10, 2009, 4:32:30 AM11/10/09
to jav...@googlegroups.com
Cara, porque vc não cria um papel para cada permissão assim vc poderá
usar spring-security ou o seam ou o realm entre outras soluções.

Ex.: O usuário tem permissão para acessar a tela de compras. Então ao
cadastrar o usuário você coloca a 'role' compras para ele. Assim para
cada permissão do sistema você cria um role.

2009/11/9 Davinir F Campos Jr <davin...@gmail.com>:

Walter Mourão

unread,
Nov 10, 2009, 5:21:27 AM11/10/09
to jav...@googlegroups.com
Esse projeto: http://sourceforge.net/projects/trinityssm

é um gerenciador de permissões, e tem exemplos com jsf e realm. Está parado pois estou meio sem tempo, mas pode ser que o que já foi feito lhe ajude em alguma coisa.

Sds,

Walter Mourão
http://waltermourao.com.br
http://arcadian.com.br
http://oriens.com.br



2009/11/10 Assis Júnior <assi...@gmail.com>

Daniel Camargo

unread,
Nov 11, 2009, 3:31:18 PM11/11/09
to jav...@googlegroups.com
Estou trabalhando em um sistema que tem uma característica bastante semelhante a sua, a única diferença é que a autenticação é feita por um webservice então tive que implementar uma versão do jaas para minha necessidade.
O que fizemos aqui foi gerar grupos menores. Imagine que tocê tenha 3 cadastros simples:
1 - Cadastro de Aluno
2 - Cadastro de Curso
3 - Cadastro de Professor


Aí basta criar os subgropos:
PERMISSAO_CONSULTAR_ALUNO (eu protego a url com esse cara pois se não pode consultar não pode fazer mais nada com a entidade)
PERMISSAO_CRIAR_ALUNO
PERMISSAO_EDITAR_ALUNO
PERMISSAO_EXCLUIR_ALUNO

PERMISSAO_CONSULTAR_CURSO
PERMISSAO_CRIAR_CURSO
PERMISSAO_EDITAR_CURSO
PERMISSAO_EXCLUIR_CURSO.

...
Com esses subgrupos você vai conseguem uma boa flexibilidade.





2009/11/10 Walter Mourão <walter...@gmail.com>
Reply all
Reply to author
Forward
0 new messages