Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

JAAS não consegui usar, Como fazer verificação de tela pelo filter?

Boa noite, tentei e tentei e tentei usar o jaas, mais não consegui fazer o procedimento, até porque tem muitas outras coisas que o instrutor usa no projeto loja dele e eu não uso, e isso ajuda a ficar muito mais perdido...

Como eu tenho a autenticação feita pelo PhashListener eu queria apenas a autenticação de paginas, como por exemplo tenho 20 paginas no meu sistema, quero restringir 3 delas para quem tiver acessosuperior, poderiam me ajudar fazendo isso em filter?

Entity
@SuppressWarnings("serial")
public class Usuario implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String login;
    private String senha;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "nivel_codigo")
    private NivelDeAcesso nivelDeAcesso = new NivelDeAcesso();
    private String confirmaSenha;
    @Lob
    private byte[] foto;
@Entity
@SuppressWarnings("serial")
public class NivelDeAcesso implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @Enumerated(EnumType.STRING)
    private NivelAcesso nivelAcesso;
    @OneToOne(mappedBy = "nivelDeAcesso")
    private Usuario usuario;
public enum NivelAcesso {
    ACESSONORMAL, ACESSOLIMITADO, ACESSOSUPERIOR;
}

Exemplo, tenho uma pagina html chamada cadastroUsuario, nessa pagina, apenas queria que entrasse quem tivesse a permissão acessosuperior, nunca usei o filter, por isso que to perdido nessa parte. Poderiam me auxilar nessa trajetória? Se possivel fazer isso mesmo em filter, sem JAAS ou outra biblioteca... obg

6 respostas

Fala Alisson, blz?

Faz o seguinte, no PhaseListener, além de verificar se o usuário está logado, verifica o nível de acesso dele. Caso ele tenha acesso à página deixa ele passar, caso não tenha redireciona para uma página padrão dizendo que ele não tem acesso àquela página.

Oi Samir estou bem e você? Pelo Phasalistener tem como? Poderia me auxiliar nisso? Como poderia ser feito isso? Muito obrigado.

Tudo bem tb =).

manda o seu PhaseListener que a gnt da uma olhada em como fazer

Que bom Samir.

public class Autorizador implements Serializable, PhaseListener {

    private static final long serialVersionUID = 1L;

    @Override
    public void afterPhase(PhaseEvent event) {
        FacesContext context = event.getFacesContext();
        String pagina = context.getViewRoot().getViewId();
        System.out.println("Nome da paginas: " + pagina);
        if ("/paginas/usuario.xhtml".equals(pagina)) {
            System.out.println("Igual");
            return;
        } else {

        }
        Usuario usuarioLogado = (Usuario) context.getExternalContext()
                .getSessionMap().get("usuarioLogado");
        if (usuarioLogado != null) {
            return;
        }
        NavigationHandler handler = context.getApplication()
                .getNavigationHandler();
        handler.handleNavigation(context, null,
                "/paginas/usuario?faces-redirect=true");

        context.renderResponse();
    }

    @Override
    public void beforePhase(PhaseEvent event) {

    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

}

Esta assim.

solução!
@Override
    public void afterPhase(PhaseEvent event) {
        FacesContext context = event.getFacesContext();
        String pagina = context.getViewRoot().getViewId();

    System.out.println("Nome da paginas: " + pagina);

        if ("/paginas/usuario.xhtml".equals(pagina)) {
            System.out.println("Igual");
            return;
        }

        Usuario usuarioLogado = (Usuario) context.getExternalContext()
                .getSessionMap().get("usuarioLogado");
        if (usuarioLogado != null) {
            if( usuario.getNivelDeAcesso() == NivelDeAcesso.ACESSOSUPERIOR){
                return;
                //se ele tem acesso superior, acredito que possa entrar em qlq página
            }else if(usuario.getNivelDeAcesso() == NivelDeAcesso.ACESSOLIMITADO){
                if(!"/paginas/paginaQueEleNaoDeveTerAcesso".xhtml.equals(pagina)){
                    return;
                }
            }else if(usuario.getNivelDeAcesso() == NivelDeAcesso.ACESSONORMAL){
                //mesma coisa que o do acesso limitado mas com todas as páginas que ele não pode acessar
            }
        }

        NavigationHandler handler = context.getApplication()
                .getNavigationHandler();
        handler.handleNavigation(context, null,
                "/paginas/usuario?faces-redirect=true");

        context.renderResponse();
    }

Acho que isso deve resolver o seu problema ou pelo menos dar um direcionamento.

Samir muito obrigado, você é fera de mais, tem muito conhecimento em programação, fico me perguntando como você entende de tudo oque eu pergunto aqui kkkkk, Isso ai é estudo e pratica né? Muito obrigado, agora vou fazer uma pagina de acessoNegado, para mostrar que esse usuario não tem acesso a pagina, e colocar um link se deseja fazer o login ou se deseja voltar a navegação kkkkk. Era isso que eu queria. E outra muito mais muito mais facil do que usar o JAAS, não se compara!!!!