Verificar usuario logado antes de executar metodo

Colegas estou com a seguinte situação: Ao clicar no p:commandButton, para salvar um registro, executo um método no bean que verifica se o usuário esta logado, caso não esteja logado chamo a pagina de login. Após logar gostaria de que método continuasse o processo e salvasse o registro. O método login é genérico, que serve para várias outras paginas, por isso eu não poderia colocar o método de salvar dentro do método de login. E algumas páginas podem ser vistas sem login, por isso não exijo login ao entrar no sistema.
Estou usando o JSF 2.2 + Hibernate 4.3.1 + Primefaces.

Infocurso.xhtml:
<p:commandButton value=“Increver-se” actionListener="#cntrCurso.testalogado(cntrCurso.curso.id)}" icon=“ui-icon-closethick” />

Bean:
public void testalogado(int idcurso){
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
Boolean conectado = (Boolean) session.getAttribute(“autenticado”);
cntrUsuario.pagina= FacesContext.getCurrentInstance().getViewRoot().getViewId().replace("/","");
if (conectado == null || !conectado) {
try {
FacesContext.getCurrentInstance().getExternalContext().redirect(“login.xhtml”);
} catch (IOException ex) {
Logger.getLogger(CntrCurso.class.getName()).log(Level.SEVERE, null, ex);
}
}
inscreverCurso(idcurso);
}

public String inscreverCurso(int idcurso){
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
idaluno = (int) session.getAttribute(“idusuario”);
inscritocurso = new Inscritoscurso();
inscritocurso.setIdaluno(idaluno);
inscritocurso.setIdcurso(idcurso);
dao.incluirInscricao(inscritocurso);
return “pag-sucesso”;
}

na pagina de login.xhtml eu tenho o metodo testausuario()
public void testausuario(){
dao = new PessoaDAO();
List lista;
lista = dao.testausuario(usuario,senha);
if (lista.size()==1) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, “Usuario Logado”, null));
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(true);
httpSession.setAttribute(“autenticado”, true);
httpSession.setAttribute(“usuario”, usuario);
httpSession.setAttribute(“idusuario”, lista.get(0).getId());
try {
FacesContext.getCurrentInstance().getExternalContext().redirect(this.getPagina());
} catch (IOException ex) {
Logger.getLogger(cntrUsuario.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, “Apelido ou Senha inválidos”, null));
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(true);
httpSession.setAttribute(“autenticado”, false);
}
}

Agradeço qualquer informação. Obrigado

Quando havia necessidade de tais validações, eu criar uma superclasse (abstrata), algo como BaseBean e fazia todos os beans que precisavam da validação estender dela.
Isso facilita muito, pois você pode, simplesmente, usar os métodos da superclasse nas classes filhas, sem maiores problemas e, continuar executando o método invocado sem maiores transtornos.

Não sei se eu entendi sua resposta, mas a situação é que quando eu vou para o bean no método testalogado() e identifico que o usuário não esta logado, eu dou um redirect para outra página, que é a pagina de login. Depois de informar usuário e senha e estar valido para usar a aplicação, eu precisaria retornar ao método testa logado e executar o método inscrevercurso(). Como se fosse uma linguagem procedural, com gosub e return.

Neste caso, você precisa garantir 3 coisas:

  • Retornar ao método em execução
  • Os dados submetidos na primeira requisição estão íntegros
  • Garantir que o usuário esteja logado

Para isso você pode optar por transmitir os dados recebidos da primeira requisição para a página de login e definir a action como a ação que foi chamada originalmente.
Deve funcionar.

Nesse caso, eu executaria a action na pagina de login ? Ou seja, redireciono para a pagina de login, enviando os atributos que eu possuo. E quando logado, através da pagina de login executaria o método inscrevercurso() ?

Para validar, não precisa. Mas, caso vá realizar login, sim.

Mas ai eu teria que ter uma pagina de login.xhtml, para cada processo que eu precise que o usuário esteja logado ?
Por exemplo, eu tenho uma página de cadastro de cursos, que para ser acessada eu utilizo o login.xhtml e redireciono de volta para a pagina de cadastro de curso.
Eu tenho uma pagina de cadastro de pessoas, que também precisa do login.xhtml e após o login ter sido feito com sucesso, eu redireciono para a pagina de cadastro de pessoas.

Quando eu chamo o login eu guardo a pagina que chamou o login e no login eu dou novamente um .redirect para a pagina que o chamou.

Quando eu quero inscrever alguém em um curso, eu preciso fazer assim: primeiro clique no botão(inscrever), não estou logado, chamo o login, e volto para a pagina origem, segundo clique no botão(inscrever) já estou logado, funciona.

Você imagina ser possível quando de um método eu dou o .redirect ser possível retornar ao ponto onde foi dado o redirect, dentro do método e continuá-lo ?

Eu tentei usar no commandbutton actionlistener(executa primeiro, o teste de estar logado ou não) e action(executa depois do actionlistener), porém ele executa em paralelo. Ele vai na pagina de login e simultaneamente salva um registro sem usuário.

Não cara, por que precisaria?
A ideia dos managed beans é permitir que você “componentize” as coisas.
A questão é que você vai precisar ter, ao menos, um mapa com os atributos de cada chamada.
Como deve saber, um mapa é uma estrutura baseada em encadeamento chave/valor que permite a inclusão de quaisquer tipos de dados.
Assim sendo, você consegue fazer esse processo de maneira bem simples.
Não sei por que pensou em tal complexidade.

Darlan, eu comecei a programar jsf faz pouco tempo, e realmente alguns conceitos ainda não conheço. Essa questão de mapa terei que pesquisar. Obrigado !

Mapa nada tem a ver com o JSF, é java básico, algo que você, teoricamente, deveria saber para partir para JSF.
Se não conhece ainda, precisa, urgentemente estudar isso e estruturas de dados em geral.

Ta certo, se essa é ajuda que eu posso ter no momento. Obrigado !

Eu te expliquei acima o que pode ser feito. Não é minha responsabilidade se você não sabe como usar a alternativa que te dei e não sabe como lidar com coisas simples como herança.
Infelizmente existe uma coisa chamada curva de aprendizado e grande parte dos problemas e reclamações acerca do java provém da falta de estudo adequado.
Aliás, você deve estar seguindo algum livro, tutorial, vídeo aula, apostila. Se não está, essa é outra dica que dou: use algo para direcionar o que está fazendo, mesmo que seja para seguir padrões.
Estudar o ciclo de vida do JSF, sua estrutura, seu funcionamento (por quê usar o FacesContext? Ele serve só para incluir mensagens?) e coisas assim.

Darlan, como que a herança pode me ajudar nesse caso ?

Veja:

  • tenho uma pagina curso.xhtml com um commandbutton (inscrever-se), que chama um método do bean controlcurso.inscreverse(). Neste método eu verifico se o usuário esta logado. Caso o usuario não esteja logado eu dou um FacesContext.getCurrentInstance().getExternalContext().redirect(“login.xhtml”); e faço o login.

  • No login.xhtml após eu ter feito o login com sucesso, eu dou um FacesContext.getCurrentInstance().getExternalContext().redirect(“curso.xhtml”); que me mostra a pagina curso.xhtml novamente. Eu preciso que antes de mostrar a pagina curso.xhtml o método controlcurso.inscreverse() continue e salve os dados, mesmo após ele ter feito o redirecionamento para a pagina de login.

O problema é que eu saio da pagina curso.xhtml e vou para login.xhtml, digamos que eu leve da pagina curso todos os dados que eu precise gravar para a pagina login, como isso poderia me ajudar ?

Obrigado