JSF com controle de acesso (phase listener)

Bom dia amigos!

Estou tentando utilizar um phase listener que um amigo me passou para fazer controle de acessos em minha webapp. Porém não entendi muito bem como tudo funciona. Estou postando a classe LoggedInCheck (phase listener) e a configuração do faces-config.xml da maneira que recebi. Minha dúvida é como configuro para que funcione corretamente com minha webapp? Em minha webapp tudo que usuários do tipo “aprovador” (existem os tipos aprovador, digitador e adm) podem acessar está em um pacote Aprovador, seguindo a mesma linha para digitador e adm. Sendo que o adm deve ter acesso a tudo, o aprovador acessa a tudo menos o conteudo do pacote Adm e o digitador apenas ao pacote digitador. Além disso alguns jsp’s estão fora dos pacotes e podem ser acessados por todos que estejam logados.
Bom, se alguém já tiver usado algo parecido ou poder dar uma olhada e ajudar, ficarei imensamente grato!

Configuração do faces-config.xml:

<lifecycle>
        <phase-listener>lifecycle.LoggedInCheck</phase-listener>
</lifecycle>

<navigation-rule>
        <from-view-id>*</from-view-id>
        <navigation-case>
            <from-outcome>logout</from-outcome>
            <to-view-id>/login.jsp</to-view-id>
        </navigation-case>
</navigation-rule>

Classe LoggedInCheck:

import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;

@SuppressWarnings("serial")
public class LoggedInCheck implements PhaseListener {

	public PhaseId getPhaseId() {
		// return PhaseId.RESTORE_VIEW;
		return PhaseId.ANY_PHASE;

	}

	public void beforePhase(PhaseEvent event) {
		FacesContext facesContext = event.getFacesContext();

	
		Boolean administracao = ((HttpServletRequest) facesContext
				.getExternalContext().getRequest()).getRequestURI().indexOf(
				"/jsf/faces/usr/") == 0;
		Boolean login = ((HttpServletRequest) facesContext.getExternalContext()
				.getRequest()).getRequestURI().indexOf("/jsf/faces/login.jsp") == 0;


		Boolean logged = Boolean.TRUE;
		if (administracao) {
			logged = facesContext.getExternalContext().getSessionMap().get(
					"usuario") != null;

		}
		

		
		Boolean administracaoA = ((HttpServletRequest) facesContext
				.getExternalContext().getRequest()).getRequestURI().indexOf(
				"/jsf/faces/adm/") == 0;
		Boolean loginA = ((HttpServletRequest) facesContext
				.getExternalContext().getRequest()).getRequestURI().indexOf(
				"/jsf/faces/login.jsp") == 0;

		
		Boolean loggedA = Boolean.TRUE;
		if (administracaoA) {
			loggedA = facesContext.getExternalContext().getSessionMap().get(
					"adm") != null;

		}
	

		if (!loginA && !loggedA) {
			facesContext.getApplication().getNavigationHandler()
					.handleNavigation(facesContext, null, "logout");
		}
		if (!login && !logged) {
			facesContext.getApplication().getNavigationHandler()
					.handleNavigation(facesContext, null, "logout");
		}

	}

	public void afterPhase(PhaseEvent event) {
	}

}

Desde já agradeço!

vamo com calma xD,

o phase listner n vai fazer isso pra vc, ele simplismente verifica se existe usuario logado, e so deixa exibir as demais paginas se existir um usuario em sessao. A parte de permissao de acesso vc tem q fzer d outra forma, uma classe separada. Imagina se vc tem q verificar/setar permissoes para usuarios a cada submit da pagina …, vc tem q setar essas permissoes uma unica vez, por exemplo qnd vc loga o usuario.

Obrigado por responder guimoz!

Você conhece algum tuto sobre permissões de acesso com jsf?

Abraço.

eu to no mesmo barco q vc haha

assim, tem alguns tutos por ai, mas n é legal faze isso com o jsf, vc tem q reinventar a roda, e o sistema vai acabar ficando mto amarrado, eu to pensando em usar o spring security, talvez o jaas, ou o ldap, tb tem o opensso. Como vc pode ver eu to bem em duvida haha, pq meu problema é um poco complicado,

mas acho q pra vc seria bom dar uma olhada no spring security (vulgo acegi)

eu faria da seguinte forma

a pagina onde eu preciso das permissões e faço um metodo que retorne um List

ai com JSTL faça um if

isso funciona, ou não?

funciona funciona so q n é mto bom fica enchendo de ifs dentro das jsps, o processamento na camada view tem q ser evitado ao maximo

isso é um caso…

mas se o nivel de permissao

for a nivel de menu, você pode fazer uma lista de menus e iterar com JSTL

para exibir somente os menus que o usuario tem permissao

ou criar o menu dinamicamente, em uma classe java, e nessa mesma classe definir oq o usuario vai poder acessar

foi o que eu disse!

não … eu digo
restringir oq vai ser exibido na criação, sem usar os ifs no jsp…

a minha primeira solução é a nivel de campo, exibir com if

creio que não haja outra solução

e a segunda foi como eu e você dissemos, porém com outras palavras!

abraço

Até hoje nada foi postado de sucesso ?

spring security resolve!

ou então utilizando uam classe de permissões e simplesmente selecionando o q pode ou não ser visualizado utilizando o atributo rendered dos componentes!