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

método request.login retorna Login Failed

Olá Amigos, estou tentando há muito tempo fazer um login básico usando JSF, WildFly, Secure Domain

Mas já despendi horas e horas, li inúmeros blogs, o site da Oracle, baixei os quickstarts do JBoss, tenho o livro da casa do código de JavaEE que da um passo-a-passo, mas mesmo assim, to manezando demais aqui e não consigo entender onde está o erro. E cheguei a conclusão que está na hora de pedir socorro.

tudo que faço, no fim da erro de Login Failed conforme abaixo, a linha 53 de Login.java é o método request.login:

17:10:09,370 ERROR [stderr] (default task-4) javax.servlet.ServletException: UT010031: Login failed
17:10:09,371 ERROR [stderr] (default task-4)     at io.undertow.servlet.spec.HttpServletRequestImpl.login(HttpServletRequestImpl.java:450)
17:10:09,371 ERROR [stderr] (default task-4)     at com.labs.jsf.beans.Login.loginUser(Login.java:53)

Comecei a debugar o fonte do Wildfly e corrigi um problema, ele estava pegando o Secure Domain padrão "other", mas já corrigi, agora ele pega o "secureDomain"

Tentei o mesmo procedimento no WildFly 11 e no 10.

Quando entro no método:

Account verifyCredential(AccountImpl account, Object credential)

Da classe JAASIdentityManagerImpl

O objeto SecurityContext vem com o atributo SubjectInfo com os campos nulos conforme abaixo:

Identities=[CredentialIdentity[principal=null;roles=null]] Subject=null Roles=null

Ele já não deveria vir preenchido com o que há nas tabelas User e UserRoles apontadas nas queries principalsQuery e rolesQuery em standalone.xml?

Preciso do mapeamento das tabelas (User e UserRoles) para entidades Hibernate? O JAAS usa o Hibernate para consultar e preciso configurá-lo?

Já chequei as configurações minusciosamente, vou postá-las abaixo:

tenho as tabelas no Mysql, e nelas preenchi com vários usuários e roles, em alguns usei o comando:

java -cp /home/bee/java/wildfly11/modules/system/layers/base/org/picketbox/main/picketbox-5.0.0.Beta1.jar org.jboss.security.Base64Encoder 123 SHA-256

em outros eu na loucura de tentar de tudo coloquei a senha pura sem hash. tenho alguns usuário com o MD5 e mudei no WildFly para MD5

fiz duas alterações no standalone.xml do wildfly, a primeira foi o data source:

               <datasource jndi-name="java:jboss/datasources/MySqlDS" pool-name="MySqlDS" enabled="true" use-ccm="false">
                    <connection-url>jdbc:mysql://localhost:3306/DBCOM?useSSL=false</connection-url>
                    <driver-class>com.mysql.jdbc.Driver</driver-class>
                    <driver>mysql</driver>
                      ....

outra parte que alterei no meu standalone.xml no wildfly, adicionei o security-domain:

        <subsystem xmlns="urn:jboss:domain:security:3.0">
            <security-domains>
                <security-domain name="secureDomain" cache-type="default">
                    <authentication>
                        <login-module code="Database" flag="required">
                            <module-option name="dsJndiName" value="java:jboss/datasources/MySqlDS"/>
                            <module-option name="principalsQuery" value="select passwd from Users where username=?"/>
                            <module-option name="rolesQuery" value="select role, 'Roles' from UserRoles where username=?"/>
                            <module-option name="hashAlgorithm" value="SHA-256"/>
                            <module-option name="hashEncoding" value="base64">
                            <!--module-option name="hashUserPassword" value="true"/> 
                            <module-option name="hashStorePassword" value="false"/-->
                        </login-module>
                    </authentication>
                </security-domain>

minha página de login:

<?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">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>login</title>
</h:head>
<h:body>
    <h:form id="loginForm">
        <h3>JSF Login Logout</h3>
        <h:outputText value="Username" />
        <h:inputText id="username" value="#{login.user}"></h:inputText>
        <h:message for="username"></h:message>
        <br></br><br></br>

        <h:outputText value="Password" />
        <h:inputSecret id="password" value="#{login.pwd}"></h:inputSecret>
        <h:message for="password"></h:message>
        <br></br><br></br>

        <h:commandButton action="#{login.loginUser}" id="loginButton" value="Login"></h:commandButton>
        <br/>
        <h:message for="loginButton"></h:message>
    </h:form>
</h:body>
</html>

esse é um trecho do meu managed bean com o método de login:

@ManagedBean
@SessionScoped
public class Login implements Serializable {

    private String pwd;
    private String msg;
    private String user;

        ...gets e sets...

    public String loginUser() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        try{
        request.login(user, pwd); //aqui da erro de login failed
        HttpSession session = SessionUtils.getSession();
        session.setAttribute("username", user);
        if(request.isUserInRole("admin")){
            return "admin";
        } else {
            return "commonUser";
        }
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Incorrect Username and Passowrd", "Please enter correct username and Password");
            context.addMessage("loginForm:loginButton", message);
            return "login";
        }
    }

abaixo o meu web.xml: nele já tentei FORM, DIGEST, BASIC e da o mesmo erro

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>tutorialJSF</display-name>
  <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>*.xhtml</url-pattern>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>bootstrap</param-value>
  </context-param>
    <login-config>
        <auth-method>FORM</auth-method><!--ja tentei DIGEST, BASIC-->
        <realm-name>secureDomain</realm-name>
        <form-login-config>
            <form-login-page>/faces/login.xhtml</form-login-page>
            <form-error-page>/faces/loginerror.xhtml</form-error-page>
        </form-login-config>
    </login-config>

   <security-constraint>
        <display-name>Admin Pages</display-name>
        <web-resource-collection>
            <web-resource-name>Protected Admin Area</web-resource-name>
            <description></description>
            <url-pattern>/faces/admin/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>HEAD</http-method>
            <http-method>PUT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
            <http-method>DELETE</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>ADMIN</role-name>
        </auth-constraint>
        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>All Access</display-name>
        <web-resource-collection>
            <web-resource-name>None Protected User Area</web-resource-name>
            <description/>
            <url-pattern>/faces/users/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>HEAD</http-method>
            <http-method>PUT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
            <http-method>DELETE</http-method>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
    <security-role>  
         <role-name>ADMIN</role-name>  
    </security-role> 
</web-app>
  • encontrei a "origem" do erro, cheguei no fonte picketbox-infinispan...jar nele tem a classe: JBossCachedAuthenticationManager.java dentro do método proceedWithJaasLogin ele vai até chamar um método defaultLogin que chama LoginContext.login() e retorna a exceção: javax.security.auth.login.FailedLoginException: PBOX00070: Password invalid/Password required

    Danilo Batista de Queiroz   02 de set de 2017
  • não sei como, mas agora funcionou, foi algum detalhezinho, ou cache.

    Danilo Batista de Queiroz   03 de set de 2017
  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!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags wildfly jboss ou faça a sua própria pergunta.