1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Capturar a instância de um Bean CDI SessionScoped

Olá caros colegas desenvolvedores,

venho tentando fazer autenticação de usuários de de um sistema de maneira simples, sem níveis de permissão. Estou utilizando Filter. O problema é quando o usuário é autenticado eu não consigo captuar o atributo da sessão, ele sempre retorna NULL. Estou utilizando JSF 2.2, CDI, EclipseLink. Eu estava utilizando ManagedBean e estava funcionando perfeitamente :/

Segue o código:

Esse é o Controller responsável pela autenticação, eu tento resuperar a instância dele na sessão(esse é meu problema).

@Named(value = "usuarioBean")
@SessionScoped
public class UserLoginBean implements Serializable {

    @Inject
    private LoginAdminServiceIF service;

    private static final long serialVersionUID = 682119314630735490L;

    private String login;
    private String senha;

    private LoginAdmin admLogado;

    private boolean loggedIn;

    public UserLoginBean() {

    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public LoginAdmin getAdmLogado() {
        return admLogado;
    }

    public void setAdmLogado(LoginAdmin admLogado) {
        this.admLogado = admLogado;
    }

    public String doLogin() {
        LoginAdmin usuarioFound = service.efetuarLogin(login, senha);

        if (usuarioFound == null) {
            JsfUtil.addErrorMessage("Usuário e senha inválidos");

            FacesContext.getCurrentInstance().validationFailed();

            return null;
        } else {

            System.err.println("Logou");
            loggedIn = true;
            setAdmLogado(usuarioFound);
            System.err.println(usuarioFound.getLogin());

            return "/resources/template/template_base.xhtml?faces-redirect=true";
        }
    }
    public String doLogout() {

        admLogado = null;
        loggedIn = false;
        JsfUtil.addSuccessMessage("Logout efetuado");
        return "/login.xhtml?faces-redirect=true";
    }

    public boolean isLoggedIn() {
        return loggedIn;
    }
}

Aqui segue meu Filter

@WebFilter( urlPatterns = {"/resources/*"})
public class LoginFilter implements Filter {

    @Inject
    private UserLoginBean usuarioMB;

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

// AQUI ELE RETORNA O BEAN NULL
        usuarioMB = (UserLoginBean) ((HttpServletRequest) request).getSession().getAttribute("usuarioBean");

        if (usuarioMB == null || !usuarioMB.isLoggedIn()) {

            String contextPath = ((HttpServletRequest) request).getContextPath();

            ((HttpServletResponse) response).sendRedirect(contextPath + "/login.xhtml");
        } else {

            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
}

Desde já agradeço a contribuição de vocês :)

  • Qual é o import do seu @SessionScoped? Precisa ser do pacote javax.enterprise.context.

    gabrielfss   08 de mai de 2015
  • Outra coisa, você possui um beans.xml dentro de WEB-INF?

    gabrielfss   08 de mai de 2015
  • Possuo sim e o import é javax.enterprise.context.SessionScoped. Lembrando que a injecão de dependência está funcionando perfeitamente. Só estou com problemas nessa parte do Login.

    VanderlanGomes   08 de mai de 2015
  • eu penso que você deveria pegar ele do facesContext ja que utiliza JSF, ex:

    FacesContext facesContext = FacesContext.getCurrentInstance();
    this.usuarioBean = facesContext.getExternalContext().getRequestParameterMap().get("usuarioBean");
    Dilnei Cunha   08 de mai de 2015
  • Dilnei Cunha, obrigado pela ajuda. Mas o método get("usuarioBean") retorna uma String, como eu vou fazer um Cast para UserLoginBean ? Complicado.

    VanderlanGomes   08 de mai de 2015
Mostrar todos os 9 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf cdi login session java java-ee ou faça a sua própria pergunta.