| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2009 15:42:58
|
rsakurai
JavaTeenager
![[Avatar]](/images/avatar/e75d0b169ffeb90d4b805790ce68a239.jpg)
Membro desde: 09/05/2008 09:42:15
Mensagens: 170
Offline
|
Ae pessoal, boa tarde.
Estou desenvolvendo uma aplicação web onde eu uso JSF + Facelets + RichFaces e preciso controlar quais paginas um usuário possui acesso e além disso dentro de uma pagina quais os componentes da tela o usuario pode ver, por exemplo um usuario operacional pode entrar na tela de pedidos e ver a lista de pedidos e detalhar algum desses pedidos, mas o usuario administrativo pode criar um novo pedido, excluir um pedido existente, etc., ou seja, quero deixar visivel na pagina apenas o que o perfil do usuario pode ver.
Pesquisei na internet e utilizando faces eu vi que posso criar PhaseListener e antes da fase de RENDER_RESPONSE eu posso pegar o viewRoot e setar o rendered dos componentes para false, dessa forma ele não aparece na tela.
Também é possivel sobrescrever cada componente da tela e dentro do meu novo componente posso colocar o controle se mostro ou não o componente na tela, mas acho que dessa forma da mais trabalho.
Gostaria de saber se alguém ja fez algo parecido com isso e qual solução utilizou ?
Obrigado.
|
www.universidadejava.com.br |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2009 10:11:04
|
dahenz
Virtual Machine Man
![[Avatar]](/images/avatar/fb6a253729096c1e92e43c26a6fdadc3.jpg)
Membro desde: 04/10/2006 16:42:13
Mensagens: 578
Offline
|
Bom dia!! Estou desenvolvendo um controle de perfil parecido com o seu!!! Porém, quando utilizo o método:
O valor que currentPage assume é o valor = "\home.jsp", óbvio pois é de home que eu faço a requisição pelos menus para entrar nas telas do sistema.
Gostaria de saber como faço para para pegar o valor seguinte à home, por exemplo pegar "cadastro.jsp", pois esse sim deve ter acesso restrito.
Se puder ajudar agradeço....
|
Daian Henz
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2009 10:31:26
|
rsakurai
JavaTeenager
![[Avatar]](/images/avatar/e75d0b169ffeb90d4b805790ce68a239.jpg)
Membro desde: 09/05/2008 09:42:15
Mensagens: 170
Offline
|
Oi dahenz,
Você só sabe qual página que será redirecionado depois que o ciclo de vida da requisição do faces passar pela fase INVOKE_APPLICATION.
Mas se você quer alterar a estrutura da arvore através do getViewId() para dar os rendered(false) nos componentes que não deve aparecer, você não vai conseguir, porque antes da fase RENDER_RESPONSE vc ainda não tem a estrutura da pagina que será exibida, e depois da fase RENDER_RESPONSE todas as alterações que você fizer não vão para a tela.
|
www.universidadejava.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2009 12:57:18
|
dahenz
Virtual Machine Man
![[Avatar]](/images/avatar/fb6a253729096c1e92e43c26a6fdadc3.jpg)
Membro desde: 04/10/2006 16:42:13
Mensagens: 578
Offline
|
Valew rsakurai!!!
Só tenho mais uma dúvida, eu consigo pelo menos bloquear o acesso à página antes do RENDER_RESPONSE???
Se consigo... onde faço isso??? Obrigado pela ajuda....
|
Daian Henz
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/03/2009 13:02:33
|
rsakurai
JavaTeenager
![[Avatar]](/images/avatar/e75d0b169ffeb90d4b805790ce68a239.jpg)
Membro desde: 09/05/2008 09:42:15
Mensagens: 170
Offline
|
Cria um PhaseListener, nele vc sobrescreve o método beforePhase() para a fase RENDER_RESPONSE e pega a pagina que ele esta querendo acessar, depois vc verifica se ele pode ou não ter esse acesso, caso ele não possa faz um redirect para alguma pagina de erro.
|
www.universidadejava.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 12:07:59
|
Kleber-rr
Virtual Machine Man
![[Avatar]](/images/avatar/ba3ce9aeca1ef55d67282287b5a4b423.jpeg)
Membro desde: 02/07/2009 12:12:02
Mensagens: 664
Offline
|
Alguem aqui conseguiu utilizar o PhaseListener?? Funcionou direitinho??
Na minha aplicação, depois que eu logo, se eu tentar acessar o banco postgres, tentar salvar algo no banco ou abrir outra jsp ele me joga na tela de login novamente. Alguem sabe me dizer o que é que está acontecendo??
Minha classe AuthorizationListener:
Minha jsp admin:
|
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 12:09:09
|
Marco A Caetano
JavaBaby
![[Avatar]](/images/avatar/005279567d8b603ac27c200cdc26261d.jpg)
Membro desde: 07/07/2009 09:00:12
Mensagens: 90
Offline
|
já usou JAAS?
|
Be the One
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 12:32:51
|
Kleber-rr
Virtual Machine Man
![[Avatar]](/images/avatar/ba3ce9aeca1ef55d67282287b5a4b423.jpeg)
Membro desde: 02/07/2009 12:12:02
Mensagens: 664
Offline
|
Marco A Caetano wrote:já usou JAAS?
Já li um pouco sobre ele, mas eu não queria fazer essa mudança drástica na minha aplicação já iniciada. E além disso, todos os tutoriais que eu vi sobre o JAAS não se usa o postgres.
Eu tenho encontrado muita dificuldade na resolução de problemas aqui no fórum. As pessoas visitam as páginas, mas não postam nada. Ou por falta de tempo, ou por falta de interesse em ajudar. Por isso, quero te agradecer por ter respondido.
Valeu.
|
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/01/2010 08:18:44
|
juniorsatanas
GUJ Master
![[Avatar]](/images/avatar/e80d4e20bea58e20d925e45e6fb7aab8.jpg)
Membro desde: 20/05/2007 01:08:24
Mensagens: 1864
Localização: web2ajax@gmail.com
Offline
|
Kleber-rr me add no msn: kafkapvh@hotmail.com email : web2ajax@gmail.com
|
Cheque Mate em 6 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/03/2010 19:35:20
|
dalmeida
What is classpath?
Membro desde: 16/12/2008 10:03:57
Mensagens: 7
Offline
|
rsakurai wrote:
...
Mas se você quer alterar a estrutura da arvore através do getViewId() para dar os rendered(false) nos componentes que não deve aparecer, você não vai conseguir, porque antes da fase RENDER_RESPONSE vc ainda não tem a estrutura da pagina que será exibida, e depois da fase RENDER_RESPONSE todas as alterações que você fizer não vão para a tela.
rsakurai, estou com esse mesmo problema. Quero fazer um controle de acesso a nível de componentes através do phase listener. Você conseguiu alguma coisa?
|
Daniel Almeida |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/03/2010 20:47:43
|
jomello_br
JavaChild
Membro desde: 22/03/2007 21:39:18
Mensagens: 148
Offline
|
Minha solução para o problema:
Crie u Listner:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.cep.filter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
/**
*
* @author joao
*/
public class AuthorizationListener implements PhaseListener {
// REPRESENTA A LISTA DE PÁGINA QUE O USUÁRIO PODE ACESSAR
private String[] paginasAutorizadas = new String[]{"/jsp/login.xhtml", "/jsp/dashBoard.xhtml", "/jsp/consultarCliente.xhtml"};
//RESPONSÁVEL POR VERIFICAR SE O USUÁRIO ESTA AUTORIZADO
public boolean verificarAutorizacao(String paginaRequisitada) {
/*
for (String pagina : paginasAutorizadas) {
if (paginaRequisitada.equals(pagina)) {
return true;
}
}
return false;
*
*/
return true;
}
/**
* Método chamado sempre apósa execução de uma determinada PHASE
* @param event - {@link PhaseEvent}
*/
public void afterPhase(PhaseEvent event) {
boolean Logado = false;
System.out.println(event.getPhaseId());
FacesContext ctx = event.getFacesContext();
if (ctx.getViewRoot() == null) {
try {
ctx.getExternalContext().redirect("/Endereco/");
} catch (IOException ex) {
Logger.getLogger(AuthorizationListener.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
String paginaDestino = ctx.getViewRoot().getViewId();
System.out.println(paginaDestino);
//CONFORME DITO ANTERIORMENTE MESMO SEM O USO DE NA FASE
// APPLY_REQUEST_VALUES O NOME DA PÁGINA ESTARA ATUALIZADO, PORTANTO E
//NESSA FASE QUE PODEMOS VERIFICAR SE O USUÁRIO ESTA AUTORIZADO A ACESSAR
//A PÁGINA REQUISITADA
// if (event.getPhaseId().equals(PhaseId.APPLY_REQUEST_VALUES)) {
ctx = event.getFacesContext();
//CAPTURA O USUÁRIO LOGADO POIS SE ESTA FASE FOR EXECUTADA SIGNIFICA QUE EXISTE USUÁRIO AUTENTICADO
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
Object usuarioLogado = session.getAttribute("currentUser");
if (usuarioLogado != null) {
Logado = true;
}
String urlDestino = ctx.getViewRoot().getViewId();
boolean isLoginPage = (urlDestino.lastIndexOf("login.jsp") > -1);
//VALIDA A AUTORIZAÇÃO PARA ACESSAR A PÁGINA
if (!Logado && !isLoginPage) {
NavigationHandler nh = ctx.getApplication().getNavigationHandler();
nh.handleNavigation(ctx, null, "loginPage");
}
}
}
/**
** Método chamado sempre antes de se executar uma determinada PHASE
* @param event - {@link PhaseEvent}
*/
public void beforePhase(PhaseEvent event) {
/*
System.out.println(event.getPhaseId());
FacesContext ctx = event.getFacesContext();
String paginaDestino = ctx.getViewRoot().getViewId();
System.out.println(paginaDestino);
if (event.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
//AQUI DEVE FICAR A LÓGICA PARA VERIFICAR SE EXISTE UM USUÁRIO
//AUTENTICADO NA APLICAÇÃO
ctx = event.getFacesContext();
//verifica se existe um usuário autenticado
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
if (session.getAttribute("usuarioLogado") == null) {
try {
//se não existir direciona para a página de LOGIN
ctx.getExternalContext().redirect("/pages/login/login.jsp");
} catch (IOException ex) {
Logger.getLogger(AuthorizationListener.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
*
*/
}
/**
* Retorna o PhaseId da fase do ciclo de vida JSF que
* esta sendo interceptado e gerênciado pelo Controle de acesso.
*
* @return - {@link PhaseId}
*/
public PhaseId getPhaseId() {
//return PhaseId.ANY_PHASE;
return PhaseId.RESTORE_VIEW;
}
}
Configure seu faces-config.xml:
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>loginPage</from-outcome>
<to-view-id>/pages/login/login.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<lifecycle>
<phase-listener>br.cep.filter.AuthorizationListener</phase-listener>
</lifecycle>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/pages/login/login.jsp</location>
</error-page>
Ele pega a session da aplicação e vai para a pagina do Login ok.
Abraços
Jomello
|
|
|
 |
|
|