JAAS com JSF - Problema com regras de navegação

Galera, blz?,
Estou com o seguinte problema, implementei o JAAS com JSF a um projeto, consegui realizar uns testes e a autenticaçao funciona, o problema é que no JSF, na pagina de login quando tento entrar ele recarrega a pagina de login, não acessando a pagina de usuario e nem a pagina de login invalido, fora o JSF funciona mais nao carrega os conteudos das paginas JSF.

segue meu faces-config

<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

    <managed-bean>
        <managed-bean-name>pais</managed-bean-name>
        <managed-bean-class>br.com.webgi.PaisBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>cargo</managed-bean-name>
        <managed-bean-class>br.com.webgi.CargoBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>cidade</managed-bean-name>
        <managed-bean-class>br.com.webgi.CidadeBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
        <managed-bean>
        <managed-bean-name>estado</managed-bean-name>
        <managed-bean-class>br.com.webgi.EstadoBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

Segue meu web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <display-name>FacesServlet</display-name>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>

          <url-pattern>/faces/*</url-pattern>
          <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
   
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
 
    
<login-config>
       <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.xhtml</form-login-page>
            <form-error-page>/logininvalido.jsp</form-error-page>
        </form-login-config>
</login-config>

    
<security-role>
        <role-name>CLI</role-name>
</security-role>
<security-role>
        <role-name>ADM</role-name>
</security-role>
<security-role>
        <role-name>USU</role-name>
</security-role>

<security-constraint>
        <web-resource-collection>
              <web-resource-name>Cliente</web-resource-name>
              <url-pattern>/local/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
              <role-name>CLI</role-name>
        </auth-constraint>
</security-constraint>
</web-app>

Talvez seja alguma coisa de regras de naveção, mais não estou conseguindo.
Desde já, obrigado pela força!!

Mesmo recarregando a página o usuário é autenticado, é isso?
Posta teu formulário de login também.

Consegui resolver esse problema, tinha um form a mais no meu formulario de login, mais o que acontece agora é que ao efetuar login o sistema nao encontra a pagina do usuario, mas se eu voltar a pagina e tentar de novo ele carrega normalmente, o que será que pode ser?

Obrigado

<?xml version="1.0" encoding="utf-8"?>
<f:view  xmlns:f="http://java.sun.com/jsf/core">
<html   xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html" 
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">
    <ui:composition template="/templates/plataforma.xhtml">
        <ui:define name="titulo">
            WebGI
        </ui:define>
        <ui:define name="corpo">
          <h1>Pagina de Acesso</h1>
          <hr />

            <h:messages />
            <h:panelGrid columns="2">
                <form method="post" action="j_security_check">
                    <label>Usuario:</label>
                    <input name="j_username"/><br/>
                    <label>Senha:</label>
                    <input type="password" name="j_password"/><br/>
                    <button type="submit" value="Logar"></button>
                </form>
            </h:panelGrid>    
            <hr />

          <p:messages id="mensagens" showDetail="true" />
          <hr />  
        </ui:define>

     </ui:composition>
</html>
</f:view>

Percebi que você está usando um:

<p:messages id="mensagens" showDetail="true" /> 

Seria para exibir mensagens do tipo: login incorreto, senha incorreta?

A partir de onde você pega as mensagens usando o JAAS?

Eu utilizo em outras paginas, de cadastro por exemplo, retornando ao usuário, sobre campos obrigatórios não preenchidos, e pelas regras de navegação do JSF, mais na pagina de login não esta exibindo, o meu problema é essa questão do JAAS só acessar na segunda tentativa, andei lendo e percebi em alguns projetos o uso do ao invés do , não entendi muito bem, voce poderia me ajudar a implementar o , talvez seja esse o problema, na requisição do JSF ele atualizar o link e acessar a pagina do usuario.

Obrigado!

Cara faz assim.

No link ou botão para a página de login de seu index.xhtml, aponte para um método do tipo:

public String minhaPaginaDeLogin(){
		return "/PastaProtegidaPeloJaas/index.xhtml?faces-redirect=true";
}
  • No seu caso, deve ser a pasta: “local”, então aponte para local/suaPagina.xhtml.

Ou seja, você vai apontar o link para uma página dentro de uma pasta protegida pelo JAAS, conforme informado no web.xml.
Ao tentar acessar esta página o usuário automaticamente será levado para a página de login do JAAS (informada no web.xml) para que possa informar as credenciais e acessar a página pretendida.

O p:messages que você utilizou não tem serventia na página de login, pois caso o usuário reprove na validação será encaminhado para a página de falha de login, informada no web.xml.

Tente fazer estes ajustes, deve conseguir.
Por favor nos dê o retorno e coloque o tópico como concluído.

[quote=henrique ganso]Eu utilizo em outras paginas, de cadastro por exemplo, retornando ao usuário, sobre campos obrigatórios não preenchidos, e pelas regras de navegação do JSF, mais na pagina de login não esta exibindo, o meu problema é essa questão do JAAS só acessar na segunda tentativa, andei lendo e percebi em alguns projetos o uso do ao invés do , não entendi muito bem, voce poderia me ajudar a implementar o , talvez seja esse o problema, na requisição do JSF ele atualizar o link e acessar a pagina do usuario.

Obrigado![/quote]
Entendi, tive o mesmo problema que você, coloca o nas tuas páginas no faces-config.xml ai que resolve, agora, eu fiz isso meio sem saber como resolveu, fiquei com a dúvida…se alguém souber responder porque tem que chamar duas vezes o link se não colocar o redirect seria legal =))

Cara, aproveitando que você também está trabalhando com JAAS, uma coisa que achei bem chata é ter que informar qual a role do usuário antes de ir pro formulário de login, por que o JAAS não sabe pra qual diretório protegido ele quer ir, ou seja, antes de fazer o login, eu tive que criar um link para cada role, pra depois de selecionado o tipo ir pra página de login. Tem como contornar isso será? Como você fez a autenticação?

No meu caso no web.xml aquele descritor de implementação padrão eu faço o mapeamento da pasta protegida para o respectivo usuario.

<security-constraint>
        <web-resource-collection>
              <web-resource-name>Cliente</web-resource-name>
              <url-pattern>/local/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
              <role-name>CLI</role-name>
        </auth-constraint>
</security-constraint>

tem um campo na tabela de usuario no BD, “grupo”, assim pelo nome do usuario é identificado a qual grupo pertence e libera o acesso, por exemplo, o usuario com cadastro no grupo CLI terá acesso ao diretorio local.

segue meu context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/Insjc_Consulta">
      <Realm 
    className="org.apache.catalina.realm.JDBCRealm" 
    connectionName="root" 
    connectionPassword="adm" 
    connectionURL="jdbc:mysql://localhost:3306/insjc_bd" 
    debug="99" 
    driverName="com.mysql.jdbc.Driver" 
    roleNameCol="GRUPO" 
    userCredCol="SENHA" 
    userNameCol="NOME" 
    userRoleTable="usuario" 
    userTable="usuario"
  />
</Context>

[quote=gRoOve][quote=mrbbm]
Ou seja, você vai apontar o link para uma página dentro de uma pasta protegida pelo JAAS, conforme informado no web.xml.
Ao tentar acessar esta página o usuário automaticamente será levado para a página de login do JAAS (informada no web.xml) para que possa informar as credenciais e acessar a página pretendida.
[/quote]
Cara, aproveitando que você também está trabalhando com JAAS, uma coisa que achei bem chata é ter que informar qual a role do usuário antes de ir pro formulário de login, por que o JAAS não sabe pra qual diretório protegido ele quer ir, ou seja, antes de fazer o login, eu tive que criar um link para cada role, pra depois de selecionado o tipo ir pra página de login. Tem como contornar isso será? Como você fez a autenticação?[/quote]

Olha, eu apenas encaminho o usuário para dentro de uma pasta protegida, automaticamente ele volta para a página de login do JAAS e ao logar ele é levado para a pasta que estava tentando acessar. Não preciso informar ROLES antes. No seu caso deve ser sua implementação, onde dependendo da ROLE o usuário é levado para tal página.

No meu caso o usuário apenas se loga. Depois de logado faço o controle de para onde ele pode ou não ir.

Você só tem a role “CLI” por enquanto, certo? Quando você vai fazer o login tem que dizer qual o link da página protegida, pra depois de realizado o login, o usuário ser redirecionado à ela.
Quando você tiver outra role, vai ter no mínimo dois links protegidos, e ai, qual vai indicar?
Por isso que eu te disse, fica uma coisa bem POG isso, o cara ter que falar qual a role dele antes, pra depois ir pro login.

Tentei implementar outra role que vai entender o que eu estou falando.

[quote=mrbbm]Olha, eu apenas encaminho o usuário para dentro de uma pasta protegida, automaticamente ele volta para a página de login do JAAS e ao logar ele é levado para a pasta que estava tentando acessar. Não preciso informar ROLES antes. No seu caso deve ser sua implementação, onde dependendo da ROLE o usuário é levado para tal página.

No meu caso o usuário apenas se loga. Depois de logado faço o controle de para onde ele pode ou não ir.[/quote]
Sim, para cada role ele tem acesso a diretórios diferentes. E agora? Não quero ter que selecionar o tipo da role antes de fazer login "/
Quando falo em selecionar o tipo da role, seria um link apontando para uma página protegida, após clicar o usuário é encaminhado à página de login, após logar é direcionado para a página do primeiro link clicado.

Como você faz o controle de para onde ele pode ir ou não?

[quote=gRoOve][quote=mrbbm]Olha, eu apenas encaminho o usuário para dentro de uma pasta protegida, automaticamente ele volta para a página de login do JAAS e ao logar ele é levado para a pasta que estava tentando acessar. Não preciso informar ROLES antes. No seu caso deve ser sua implementação, onde dependendo da ROLE o usuário é levado para tal página.

No meu caso o usuário apenas se loga. Depois de logado faço o controle de para onde ele pode ou não ir.[/quote]
Sim, para cada role ele tem acesso a diretórios diferentes. E agora? Não quero ter que selecionar o tipo da role antes de fazer login "/
Quando falo em selecionar o tipo da role, seria um link apontando para uma página protegida, após clicar o usuário é encaminhado à página de login, após logar é direcionado para a página do primeiro link clicado.

Como você faz o controle de para onde ele pode ir ou não?[/quote]

Depois de logado, ao clicar para ir para determinada página, por exemplo, administração, verifico se ele tem a ROLE necessária para acessar esta página. Em alguns casos o botão ou link só é exibido se o usuário tiver esta ROLE.

Saquei, faltou pensar um pouquinho, hehe.

:thumbup:

[quote=mrbbm]Cara faz assim.

No link ou botão para a página de login de seu index.xhtml, aponte para um método do tipo:

public String minhaPaginaDeLogin(){
		return "/PastaProtegidaPeloJaas/index.xhtml?faces-redirect=true";
}
  • No seu caso, deve ser a pasta: “local”, então aponte para local/suaPagina.xhtml.

Ou seja, você vai apontar o link para uma página dentro de uma pasta protegida pelo JAAS, conforme informado no web.xml.
Ao tentar acessar esta página o usuário automaticamente será levado para a página de login do JAAS (informada no web.xml) para que possa informar as credenciais e acessar a página pretendida.

O p:messages que você utilizou não tem serventia na página de login, pois caso o usuário reprove na validação será encaminhado para a página de falha de login, informada no web.xml.

Tente fazer estes ajustes, deve conseguir.
Por favor nos dê o retorno e coloque o tópico como concluído.

[/quote]

Sem sucesso, continua não acessando a pagina protegida no primeiro acesso o link vai para “http://localhost:8080/Insjc_Consulta/local/RES_NOT_FOUND”, a autenticação é realizada e se eu realizar nova tentativa a pagina é acessada normalmente.

eu já apontava um link para a pagina protegida e mesmo adicionando o ?faces-redirect=true a frente do link, continua do mesmo jeito. Tentei alterar meu faces-config utilizando

    <navigation-rule>
        <from-view-id>/login.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>case1</from-outcome>
            <to-view-id>/local/indexigreja.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
    </navigation-rule>

Sem sucesso, será necessário implementar um bean para o login? ou estou deixando passar alguma coisa no meu JSF?
Obrigado!

Obrigado a todos, consegui resolver o problema, alterei o meu web.xml, ao invés de apontar para /local/* eu apontei para a pagina principal da pasta protegida.
segue meu web.xml

<security-constraint>
        <web-resource-collection>
              <web-resource-name>Cliente</web-resource-name>
              [b]<url-pattern>/local/indexigreja.xhtml</url-pattern>[/b]
        </web-resource-collection>
        <auth-constraint>
              <role-name>CLI</role-name>
        </auth-constraint>
</security-constraint>

Obrigado, fechado… :slight_smile: