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 2017não sei como, mas agora funcionou, foi algum detalhezinho, ou cache.
— Danilo Batista de Queiroz 03 de set de 2017