JSF - Controle de acesso as páginas e componentes  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
rsakurai
JavaTeenager
[Avatar]

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
[WWW]
dahenz
Virtual Machine Man
[Avatar]

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
[Email]
rsakurai
JavaTeenager
[Avatar]

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
[WWW]
dahenz
Virtual Machine Man
[Avatar]

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
[Email]
rsakurai
JavaTeenager
[Avatar]

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
[WWW]
Kleber-rr
Virtual Machine Man
[Avatar]

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:

Marco A Caetano
JavaBaby
[Avatar]

Membro desde: 07/07/2009 09:00:12
Mensagens: 90
Offline

já usou JAAS?

Be the One




Kleber-rr
Virtual Machine Man
[Avatar]

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.

juniorsatanas
GUJ Master
[Avatar]

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
[WWW] [Yahoo!] aim icon [MSN] [ICQ]
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
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

[Email]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team