Logar com Permissões JSF

Olá,
Estou tentando criar uma validação de usuário, porém preciso que se ele for ADMINISTRADOR tenha acesso total, parte de requisição de material e parte de administração do sistema, coloquei um filter, tá funcionado porém só consigo validar UM TIPO DE USUARIO, por exemplo: Se eu entrar com a senha de administrador certa ele valida, se entrar com a errada ele não faz nada, fica onde está, mas se eu entrar com a senha de usuario requisitante ele tbm não faz nada.
meus códigos…

Validação User

public class PessoaFace {

    PessoaDao dao = new PessoaDao();
    private String login;
    private String senha;

    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;
    }

    /** Creates a new instance of PessoaFace */
    public PessoaFace() {
    }

    public String doLogin() throws ClassNotFoundException, SQLException {
       
        boolean valido = dao.validateUser(login, senha);
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pessoaLogada", valido);
      if (valido) 
            return "gotoInicio";
         else
            if (validoReq) 
                return "gotoRequisicao";
            else 
                return "gotoError";
            }

        }

AutenticarUserFilter metodo doFilter()


 public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
	throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String url = req.getRequestURL().toString();
Object logged = req.getSession().getAttribute("pessoaLogada");
if (logged == null || ((Boolean)logged).booleanValue()== false){
if (!url.contains("login")){
    resp.sendRedirect("/ProjetoGAPF/login.faces");
}
}

Minha Instrução Sql de Validação

public class PessoaDao extends DataUtil {

    private int administrador = 1;
    private int requisitante = 2;
    public PessoaDao() {
        super();
    }

    public boolean validateUser(String login, String senha) throws ClassNotFoundException, SQLException{
        PreparedStatement ps = getPreparedStatement("SELECT * FROM gerenciamento02.pessoa where pess_login = ? " +
        " and pess_senha = ? and tipo_id = ? ");
        ps.setString(1, login);
        ps.setString(2, senha);
        ps.setInt(3, administrador);
        ResultSet rs = ps.executeQuery();
        boolean toReturn = rs.next();
        rs.close();
        ps.close();
        return toReturn;
    }
     public boolean validateReq(String login, String senha) throws ClassNotFoundException, SQLException{
        PreparedStatement ps = getPreparedStatement("SELECT * FROM gerenciamento02.pessoa where pess_login = ? " +
        "and pess_senha = ? and tipo_id = ? ");
        ps.setString(1, login);
        ps.setString(2, senha);
        ps.setInt(3, requisitante);
        ResultSet rs = ps.executeQuery();
        boolean toReturn = rs.next();
        rs.close();
        ps.close();
        return toReturn;
    }

}

Se alguém puder me ajudar…

cara coloca sua view ai pra gente … valeu!

tá aí…

<f:view>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>GAPF</title>
        </head>
        <body>

            <h1>Gerenciamento de Almoxarifado</h1>
            <h2>Caso não tenha um login entre em contato com o NTI, ramal ...</h2>
            <h:form>


                <h3> <h:outputLabel style=" left: 300px; top: 220px; position: absolute"
                               value="LOGIN"/></h3>
                <h:panelGrid style="left: 300px; top: 250px; position: absolute"
                             border="1"  columns="2" >

                    Usuario:  <h:inputText value="#{PessoaFace.login}"/>


                    Login:  <h:inputSecret maxlength="8" value="#{PessoaFace.senha}"/>

                        </h:panelGrid>
                    <h:commandButton style="left: 300px; top: 320px; position: absolute"
                                     value="Login" action="#{PessoaFace.doLogin}"/>
                    <h:commandButton style="left: 360px; top: 320px; position: absolute"
                        value="Cancelar"/>
            </h:form>


        </body>
    </html>
</f:view>

Não repara no visual, é teste…rsrsrs

O seu método doLogin, invocado pela view, executa a query presente no validateUser. Pelo o que eu entendi, essa query vai buscar no banco um registro do tipo administrador com o nome de usuário e senha passados pela view. Se for um usuário do tipo admistrador, a variável valido será true, se for um usuário normal (não-administrador) a variável tera o valor false (mesmo se exister no banco um registro com nome de usuario e senha correspondentes).

Você poderia criar um método no seu DAO que fosse buscar no banco apenas pelo nome/senha, e depois atribuisse um papel de usuário à sessão de acordo com o tipo de usuário correspondente a esse nome/senha. Depois, a autorização dos elementos do seu view pode se basear nos papéis de usuário associados à sessão.

Falouuuuu!!!

Dica:
tens dois métodos iguais na DAO para login.
Você poderia ter feito somente um, e retornar o tipo de usuário e não um boolean, na view você verificaria o tipo de usuário e redirecionaria para a página em questão.

Sobre o erro, verifique o faces-config se todas as navegações estão corretas.

EDIT:
O colega acima comentou a mesma coisa que eu. :smiley:

Bom meu código ficou faltando um boolean no PessoaFace…

  boolean valido = dao.validateUser(login, senha);
        boolean validoReq = dao.validateReq(login, senha);  //Ficou faltando esse aqui que verifica o método validoReq
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pessoaLogada", valido);
        if (valido) 
            return "gotoInicio";
         else
            if (validoReq) 
                return "gotoRequisicao";
            else 
                return "gotoError";
            }

        }

porém acho que não faz muita diferença…
Na minha lógica tentei fazer que se o usuário fosse do tipo 1 passaria para a regra “gotoInicio” e caso contrário verificaria o tipo2 se fosse verdadeiro passaria para a regra “gotoRequisicao”, se fosse falso regra “gotoError”, porém aqui eu tô jogando na sessão o tipo 1 tá logado[quote] FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“pessoaLogada”, valido);[/quote] e não estou jogando caso fosse do tipo dois e também minha lógica nos if …else acho que não ficou certa…

Felipe não compreendi muito bem o que vc disse, pelo que eu tentei fazer eu joguei o usuário na sessão, ou estou errado?
e como basear minha autorização dos elementos da view associados a sessão?

Cara faz so assim… no seu metodo de login pegue o usuario do banco e coloque na secao, nao coloque valor boleano. no seu filtro vc verifica o usuario.

if(usuario == null)
    redirect "login";
else {
    if(usuario.getTipo = 1)
        redirect "inicio";
    if(usuario.getTipo = 2)
        redirect "solicita";
}

ai fica simples. entendeu? desculpe eu ter colocado a parte do filtro assim. tava sem coragem de digitar o codigo correto.