Login com JSF e JAAS usando Glassfish

2 respostas
F

Olá a todos.
Estou tentando fazer um login usando JAAS e JSF 2 no servidor Glassfish v3.1.2

Acontece que estou recebendo esse erro:
Não foi possível encontrar um caso de navegação correspondente na ID de exibição '/login.xhtml' para a ação '#{beanLogin.login()}' com o resultado 'error'
Minha página login.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./modeloLogin.xhtml"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html">
    
    <ui:define name="content">
<p:growl id="growl" showDetail="true" life="3000" />  

        <div id="formulario">
            <p:panel id="pnl" header="Login">
                <h:form>  
                    <h:panelGrid columns="2" cellpadding="5">  
                        <h:outputLabel for="username" value="Usuário:" />  
                        <p:inputText value="#{beanLogin.username}"   
                                     id="username" required="true" label="username" />  

                        <h:outputLabel for="password" value="Senha:" />  
                        <p:password value="#{beanLogin.password}" feedback="false" minLength="" id="password"  label="password" />
                        
                        <p:commandButton id="loginButton" value="Efetuar Login" update=":growl"
                                         action="#{beanLogin.login()}" ajax="false"/> 
                        <p:commandLink value="Esqueceu a senha?" ></p:commandLink>

                    </h:panelGrid>  
                </h:form>                     
            </p:panel>
        </div>

    </ui:define>
</ui:composition>
Meu BeanLogin:
@Stateless
@Named
public class BeanLogin {

    private String username;
    private String password;

    public BeanLogin() {
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    

    public String login() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        try {
            request.login(this.username, this.password);
        } catch (ServletException e) {
            context.addMessage(null, new FacesMessage("Login failed."));
            return "error";
        }
        return "loginAdmin";
    }

    public void logout() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        try {
            request.logout();
        } catch (ServletException e) {
            context.addMessage(null, new FacesMessage("Logout failed."));
        }
    }
}
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>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>
    <servlet>
        <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>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>pages/login.xhtml</welcome-file>
        <welcome-file>faces/login.xhtml</welcome-file>
    </welcome-file-list>
    <security-constraint>
        <display-name>Páginas de Administradores</display-name>
        <web-resource-collection>
            <web-resource-name>admin</web-resource-name>
            <description>admin</description>
            <url-pattern>/pages/protected/admin/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>Páginas de Professores</display-name>
        <web-resource-collection>
            <web-resource-name>professor</web-resource-name>
            <description>professor</description>
            <url-pattern>/pages/protected/professor/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>professor</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>sonic</realm-name>
        <form-login-config>
            <form-login-page>/pages/login.xhtml</form-login-page>
            <form-error-page>/pages/login.xhtml</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <role-name>admin</role-name>
    </security-role>
    <security-role>
        <role-name>professor</role-name>
    </security-role>
</web-app>
Meu Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="Projeto_SonicPU" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>sonic</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>
Meu glassfish-web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <context-root>/sonic</context-root>
  <security-role-mapping>
    <role-name>admin</role-name>
    <group-name>admin</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>professor</role-name>
    <group-name>professor</group-name>
  </security-role-mapping>
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
</glassfish-web-app>
E apesar de normalmente não precisar usar o faces-config.xml no JSF 2, fiz um para ter certeza de que a página seria direcionada...:
<?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">

    <navigation-rule>  
            <from-view-id>/login.xhtml</from-view-id>  
            <navigation-case> 
                <from-action>>#{beanLogin.login()}</from-action>  
                <from-outcome>loginAdmin</from-outcome>
                <to-view-id>/pages/protected/admin/index.xhtml</to-view-id>
            </navigation-case>    
        </navigation-rule>  
</faces-config>

O que vocês acham que pode ser?
Obrigado a todos pela ajuda

2 Respostas

H

Ao dar erro você está fazendo:
return “error”;

Mas você não tem nenhuma página chamada error ou mapeamento no faces-config.xml

F

Muito obrigado, jakefrog
Não está mais dando o erro.

No entanto, ainda não está logando. Está voltando para a página de login.

No console do glassfish está com essas linhas de erro:

Advertência: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception Grave: SEC1111: Cannot load group for JDBC realm user [admin]. Advertência: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception Grave: SEC1111: Cannot load group for JDBC realm user [admin]. Advertência: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception Advertência: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception Advertência: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception

O que isso indica? Algum erro no código ou eu configurei o glassfish errado?

Criado 19 de maio de 2012
Ultima resposta 19 de mai. de 2012
Respostas 2
Participantes 2