Validação de Login de Usuário com JSF e JAAS

Olá pessoal, tudo bem?

Em outro post eu mostrei como fazer uma validação via Servlet e Filter. Vamos fazer de um modo diferente hoje, vamos validar usuário utilizando JSF e JAAS.

A validação de usuário via JAAS faz com que o próprio servidor valide o usuário e sua senha juntamente a qual perfil de acesso ele tem. Sem a necessidade de a todo o momento estar (programaticamente) defendendo nossa aplicação. Deixemos o JBoss fazer isso por nós.

A seguir todos os links sobre web que já postei aqui no Blog: JSF: Converter e Bean Auto Complete, JSF – Hello World, Auto Complete, Autenticação de Usuários (Filter/Servlet), Tratando Exceções em uma Aplicação Web, Criando um WebServer.

Nós iremos utilizar JSF, Postgres, Eclipse e o JBoss 6:

O JBoss Tools é apenas para adiantar a parte JSF e poder utilizar o JBoss 6 por dentro do Eclipse. Você poderá criar todo o código passado aqui, e depois colocar apenas o war dentro da pasta do JBoss e executá-lo por fora do Eclipse. E mais acima tem um link para o post de como fazer de como fazer uma aplicação JSF.

Não irei mostrar como instalar o Postgres, pois irá fugir do tema do post, mas você poderá utilizar qualquer banco como MySQL, SqlServer, Oracle e assim vai.

Para instalar o JBoss Server descompacte o arquivo e pronto.

Descompacte o Eclipse e instale o JBoss Tools. É uma ferramenta muito boa quando se trabalha com JBoss e JSF.
Para instalar o JBoss Tools vá ao menu Help >Install New Software digite o endereço http://download.jboss.org/jbosstools/updates/stable/helios/na barra “Work with” e aperte a tecla “enter”.

Para ficar mais fácil, selecionei essas duas opções:

Depois avance e finalize a instalação.
E para instalar o servidor é fácil, botão direito na aba “Servers” > New > Server
Selecione JBoss 6 > Next

Selecione o path onde está seu JBoss descompactado.

E agora clique em Finish.

Vamos criar um novo projeto JSF (File > New > Project). Estou utilizando já um modelo pronto fornecido pelo JBoss Tools. Caso você queria criar um projeto JSF do zero, basta olhar mais acima onde eu postei outros links sobre a parte web.

Configure sua aplicação, eu a estou chamando de LoginJSF, selecione JSF 2.0 e depois clique em Finish.

O Eclipse irá perguntar se você quer mudar o modo de visualização web, eu marquei que não. Você pode marcar o sim depois e ver como que fica.

Ele irá criar uma aplicação onde já tem uma navegação básica. Note que ele já adicionou seu projeto dentro do servidor, caso não o tenha adicionado clique com o botão direito em cima do projeto >Run As > Run on Server. E selecione o JBoss.


Rode o servidor e acesse o seguinte link: http://localhost:8080/LoginJSF/

Pare o JBoss pois vamos criar três pastas:

  • Uma pública
  • Uma com acesso apenas para admin
  • Uma com acesso parar admin e user

Abaixo, como ficará nossa estrutura de arquivos e os arquivos listados.

<?xml version="1.0"?>
<!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"
      xmlns:composite="http://java.sun.com/jsf/composite">

    <h:head>
        I am public! [=
    </h:head>
    <h:body>
        Everyone can see me. o/
    </h:body>
</html>
<?xml version="1.0"?>
<!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"
      xmlns:composite="http://java.sun.com/jsf/composite">

    <h:head>
        Yes master admin! Welcome!
    </h:head>
    <h:body>
        Let us run this business!
    </h:body>
</html>
<?xml version="1.0"?>
<!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"
      xmlns:composite="http://java.sun.com/jsf/composite">

    <h:head>
        Welcome mister user!
    </h:head>
    <h:body>
        <br/>
        Please, do not create any bugs, ok?! >=)
    </h:body>
</html>

Agora vamos criar as configurações que interessam. Primeiramente, vamos alterar o “web.xml” para que ele proteja as nossas páginas:

<?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">
    <display-name>LoginJSF</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>*.jsf</url-pattern>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    <!-- Protected Areas -->
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Only admins</web-resource-name>
            <url-pattern>/pages/protected/admin/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMIN</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Users and admins</web-resource-name>
            <url-pattern>/pages/protected/user/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMIN</role-name>
            <role-name>USER</role-name>
        </auth-constraint>
    </security-constraint>

    <!-- Validation By Form -->
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/pages/public/login.xhtml</form-login-page>
            <form-error-page>/pages/public/loginError.xhtml</form-error-page>
        </form-login-config>
    </login-config>

    <!-- Allowed Roles -->
    <security-role>
        <role-name>ADMIN</role-name>
    </security-role>
    <security-role>
        <role-name>USER</role-name>
    </security-role>

    <!-- Filter to get the user name and work with it -->
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.filters.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/pages/protected/*</url-pattern>
    </filter-mapping>
</web-app>

Nós iremos precisar de uma página para login juntamente com uma página para erro. Observe que essas páginas estão descritas no “web.xml”.

<!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:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    JSF 2 Login
</h:head>
<h:body>
    <p>Login to access secure pages:</p>
    <form method="post" action="j_security_check">
        <h:panelGrid columns="2">
            <h:outputLabel for="j_username" value="Username" />
            <input type="text" id="j_username" name="j_username" />
            <h:outputLabel for="j_password" value="Password" />
            <input type="password" id="j_password" name="j_password" />
            <input type="submit" name="submit" value="Login" />
        </h:panelGrid>
        <br />
    </form>
</h:body>
</html>
<!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:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    JSF 2 Login
</h:head>
<h:body>
    <p>Ops! Check your user and password</p>
</h:body>
</html>

Vamos criar um Filtro java que irá capturar o nome do login que foi digitado onde você poderá utilizar o login para buscar no banco de dados o usuário e colocá-lo na sessão.

package com.filters;

import java.io.IOException;

import javax.servlet.*;

import org.jboss.security.SecurityAssociation;

public class LoginFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException,
            ServletException {

        String userName = SecurityAssociation.getPrincipal().getName();

        System.out.println("Yeeey! Get me here and find me in the database: " + userName);

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

Vamos criar agora nossas tabelas no banco de dados?

Estou utilizando um exemplo mais simples possível, duas tabelas apenas e cada uma com o mínimo de campos necessários.
Crie um database chamado LoginJSF e em seguida execute o script abaixo:

CREATE TABLE "users"
(
  "name" character varying(50),
  pass character varying(50)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "users" OWNER TO postgres;

CREATE TABLE user_roles
(
  user_name character varying(50),
  role_name character varying
)
WITH (
  OIDS=FALSE
);
ALTER TABLE user_roles OWNER TO postgres;

Vamos inserir dois usuários, um com perfil de USER e outro com perfil de ADMIN:

INSERT INTO users("name", pass) VALUES ('user', 'user');
INSERT INTO users("name", pass) VALUES ('admin', 'admin');
INSERT INTO user_roles(user_name, role_name) VALUES ('user', 'USER');
INSERT INTO user_roles(user_name, role_name) VALUES ('admin', 'ADMIN');

Estamos quase lá, seja um pouquinho mais paciente! [=

Agora precisamos configurar o arquivo “login-config.xml” do próprio JBoss. Ele fica no diretório /JBOSS_QUE_VC_DESCOMPACTOU/server/default/conf/ . Adicione as seguintes linhas nele junto com as outras tags declaradas como “application-policy”:

<!-- Others application-policy -->

<!-- ..................... -->

<!-- Security Profile Of our Software-->
<application-policy name="LoginJSFRealm">
    <authentication>
        <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
            <module-option name="dsJndiName">java:/LoginJSFRealmDS</module-option>
            <module-option name="principalsQuery">select pass from users where name=?</module-option>
            <module-option name="rolesQuery">select role_name, 'Roles' from user_roles where user_name = ?</module-option>
        </login-module>
    </authentication>
</application-policy>

Acabamos de informar o JBoss que iremos utilizar o Realm:LoginJSFRealm e precisamos informar ao JBoss agora que nossa aplicação irá utilizar esse Realm. Vamos criar um arquivo chamado “jboss-web.xml” dentro da pasta WEB-INF com o seguinte código:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <!-- Links with JBoss the Realm to use -->
    <security-domain>java:/jaas/LoginJSFRealm</security-domain>
</jboss-web>

No arquivo “login-config.xhml” informamos ao JBoss para utilizar o seguinte datasource LoginJSFRealmDS. Através desse datasource ele irá se conectar ao banco de dados. Crie um arquivo chamado “LoginJSFRealm-ds.xml”dentro da pasta /JBOSS_QUE_VC_DESCOMPACTOU/server/ default/deploy/:

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

<datasources>
    <local-tx-datasource>
        <jndi-name>LoginJSFRealmDS</jndi-name>
        <connection-url>jdbc:postgresql://localhost:5432/LoginJSF</connection-url>
        <driver-class>org.postgresql.Driver</driver-class>
        <user-name>postgres</user-name>
        <password>YOUR_PASSWORD</password>
        <!-- sql to call when connection is created. Can be anything, select 1 is valid for PostgreSQL <new-connection-sql>select 1</new-connection-sql> -->

        <!-- sql to call on an existing pooled connection when it is obtained from pool. Can be anything, select 1 is valid for PostgreSQL <check-valid-connection-sql>select
            1</check-valid-connection-sql> -->

        <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
        <metadata>
            <type-mapping>PostgreSQL 7.2</type-mapping>
        </metadata>
    </local-tx-datasource>
</datasources>

E por último, copie o Driver JDBC 4 do Postgres que você fez o download para o diretório /JBOSS_QUE_VC_DESCOMPACTOU/server/ default/lib/.

Vamos agora rodar nossa aplicação e fazer o teste final? o/
Acesse ao diretório publico primeiro: http://localhost:8080/LoginJSF/pages/public/public.html


Vamos ao diretório que apenas Admin pode acessar: http://localhost:8080/LoginJSF/pages/protected/admin/admin.html

Digite a senha e o usuário correto e pronto. Você irá logar.


E se um usuário tentasse acessar o link do admin? Faça o teste e veja o que acontece:

Tente o mesmo com o USER acessando a URL: http://localhost:8080/LoginJSF/pages/protected/user/user.html
Bem, por último e não menos importante, note no console quem apareceu por lá:

Através do filtro você irá conseguir fazer a consulta no seu banco de dados utilizando o usuário digitado e colocá-lo na sessão.

Importante 1: Você só irá passar pelo filtro após o login com sucesso feito pelo usuário. O trabalho de validar se o usuário digitou a senha correta fica por conta do JBoss! ;)

Importante 2: Caso você digite a senha correta e ele te envie para a tela de erro confira novamente os dados do JBoss como datasource,se o nome do datasource declarado no login-config é igual ao nome declarado dentro do arquivo de final “–ds.xml”, se as configurações descritas no datasource estão ok como senha, database, url de conexão.

Importante 3: Só após terminar o post percebi que eu dei o nome às páginas como html e não xhtml (user.html, admin.html, public.html). Você pode alterar e acessar novamente vendo o JSF entrar em ação (não se esqueça de acertar trocando o link e colocando xhtml no final!). Foi mals! =/

Espero que o post possa ter lhe ajudado.

Qualquer dúvida, pergunta ou sugestão basta falar.

Até a próxima pessoal! o_

90 thoughts on “Validação de Login de Usuário com JSF e JAAS

  1. Olá, teria como fazer um novo tutorial com jboss 7?
    Estou tentando usar ele pois é o mais usado no mercado, mas estou achando absurdamente mais irritante que o glassfih.

    Desde configurar um datasource o realm até criar o projeto no eclipse.

    Tentei criar um projeto JPA um projeto EJB e um projeto WEB com um projeto EAR ligando o EBJ e o JPA. O JPA fica dando erro do hibernate, sendo q gostaria de usar a configuração que fiz no servidor do JBOSS e não te rq criar outro arquivo de configuração.

    Tentei criar um projeto web com tudo, mas ele da erro 404, nem abre página nenhuma e não acusa nenhum erro em parte alguma. Nada no console, nada no código, nem warning nos XML.

    Sobre JAAS, tenho mesmo que escrever um sql no xml? não basta informar a tabela e os campos? Achei muito estranho isso.

    Em fim, gostaria que vc me ajudasse criando esse novo tutorial com jbos7 se não vou jogar essa merda toda na lixeira e ficar com o glassfish mesmo.

  2. E aew,
    seguinte tentei fazer como no seu tutorial, mas quando efetuo login errado ele não direciona para pagina de erro, mostra uma página em branco, mas no console mostra:
    Login failure: javax.security.auth.login.FailedLoginException: No matching username found in Principals.

    Quando acesso uma pagina protegida sou direcionado para o login, ai coloco o usuário correto recebo o erro:
    HTTP Status 403 – Access to the requested resource has been denied

    se acesso diretamente a pagina de login recebo um erro dizendo q a conexão foi reiniciada.

    Sabe o que pode ser?

    • Olá Vinícius, boa tarde.

      Parece que ele não encontrou usuário no banco de dados.

      Configura também se os papéis configurados no web.xml estão iguais aos papéis no banco de dados.

      Até a próxima.

  3. Olá,

    esse exemplo foi bom,pois tinha algumas duvidas e vendo e fazendo consegui ver os resultados.

    Obrigado.

    abs

  4. Olá,

    queria fazer uma alteração nesse exemplo mais está me dando erro. O que queria entrar com url http://localhost:8080/escola e entrar a tela login onde solicita o usuário e senha caso o usuário e senha seja valido chamaria uma tela onde possui menu geral do sistema…É possível fazer isso fazer login não em cima dos diretórios ..

    Se puder me ajudar agradeceria…

    abs

  5. Parabéns pelo tópico!

    Para ajudar o pessoal que está com problemas.. segue como aumentar o nível do log do JBoss. Com isso o console vai mostrar o que está acontecendo de errado no login..

    JBoss 6:

    The config is located at: deploy/jboss-logging.xml

    To enable TRACE logging of the security layer:

    a) switch e.g. the CONSOLE appender to TRACE (default is “INFO”, which would not produce much output from the security layer):

    b) activate TRACE logging for the category “org.jboss.security”. If you need to trace security problems in the web layer, you might also have to add the categories “org.jboss.web.tomcat.security” and “org.apache.catalina”:

    No link abaixo tem como alterar o nível para o JBoss 5 também
    https://community.jboss.org/wiki/SecurityFAQ

    Abraço galera!

    • Olá Leonardo, bom dia.

      Falando assim não consigo imaginar um motivo.

      Pode ser que o login não foi realizado com sucesso.

      Até a próxima.

      • uaihebert
        Parabens pelos Posts, usei esse e o da aplicação completa e conssegui finalizar, estou usando Jboss 7,
        com relação ao problema citado eu resolvi realizando a troca baixo:

        de
        SecurityAssociation.getPrincipal().getName()

        para:
        SecurityContextAssociation.getPrincipal().getName()

        Att.
        por

  6. e se eu quiser manipular o usuário? será na classe LoginFilter? andei olhando por ai e tem uma classe chamada “LoginModule” que o pessoal cria, pra que serve?

    • Olá Alan, boa tarde.

      Ou você trata na classe LoginFilter, ou então pode criar um ManagedBean para isso. Aqui tem um exemplo: http://uaihebert.com/?p=836&page=8
      Nessa outra abordagem não precisa do LoginFilter. [=

      Quanto ao LoginModule você terá que analisar o que contém nessas classes. Cada um pode implementar de um modo diferente. [=

      Obrigado pela visita.

  7. entao eu fiz esse tutorial ai usando o jboss 7 e nao tem import pra SecurityAssociation

    eu vi akele outro tutorial seu, aplicação completa com o jboss 7 e não consegui fzer ele… mesmo baxando o projeto deu uns erros :(

  8. ah, eu tirei o SecurityAssociation e td funciono beleza… como eu faço pra por exemplo, se o cara acessa como usuario e tenta entrar no login, aparecer uma pagina de erro, por exemplo, nao aparecer akela imagem q vc coloco na frese “E se um usuário tentasse acessar o link do admin? Faça o teste e veja o que acontece:”

  9. Por favor me tirem uma dúvida!

    Quanto aos nomes dos campos no banco de dados para usuario e senha eu posso colocar qualquer nome, ou tenho que colocar name e pass? Porque com esses nomes meu sistema funciona, mas quando coloco outro nome da erro!! me ajuda por favor =(

    • Olá Vanderson, boa noite.

      Quanto ao nome das colunas apenas fique atento ao fato de que certos bancos de dados não aceita qualquer nome.

      Existe um banco, se não me engano o Postgre, que apesar de deixar você criar uma tabela chamada users na hora do select acontece um erro.

      Você pode colocar qualquer nome que não interfira com as palavras reservadas do banco.

      Espero ter ajudado.

      • Cara, você ja me ajudou a partir do momento que você colocou esse post no ar. Vasculhei a net atraz de um post juntando jaas, postgres e JSF. Então, sempre que coloco outros nomes da erro. Por exemplo coloco os nomes das tabelas de usuários e de atividade, insiro dados nelas mas quando vou tentar fazer login da erro de usuário invalido. Eu sei que tenho que alterar o xml LoginJSFRealm-ds para funcionar com outro nome de tabela. Teria mais alguma coisa que eu precise alterar?

        Thanks in advance!!

        • Olá Vanderson, bom dia.

          Realmente não deveria dar erro. Verifique se as consultas descritas no standalone.xml estão corretas.

          Elas podem estar te atrapalhando.

          Desculpe a demora em responder.

          Até mais! o_

          • Que isso camarada, sem problemas. Quanto à esse problema já está resolvido!
            Só que programação sabe como é né, você resolve um problema e derrepente outro erro na sua cara PA! … velho quando uso a tag “dataTable” do JSF para carregar uma lista do hibernate, ele abre 10 conexões para carregar uma lista do banco! Sabe como resolvo isso velho?

            tks in advance em!

          • Olá Vanderoson, boa tarde.

            Veja se as consultas que estão abrindo são para consultar os dados que estão como LAZY.

            Att,

  10. Olá, uso glashfish e caso a senha não seja a correta, ele não envia para a página loginErro.xhtml e sim http://localhost:8080/ws/faces/j_security_check porque ocorre isso se eu definir que a página de erro é a LoginErro.xhtml? (detalhe que esse http://localhost:8080/ws/faces/j_security_check puxa o que eu digito na página de erro, porém perde toda a formatação (pensei que poderia ser algo com o template, então implementei a página por completo e nada)

    E outra, quando o usuário consegue logar, o jaas envia ele para a raiz da aplicação http://localhost:8080/ws/ , que perde toda a formatação da página também, como arrumo isso também?

    Desde já agradeço a ajuda!

    Obs: vc não tem conta no guj? :D

    • Olá Matheus, boa noite.

      Tenho conta no GUJ sim, sou o jakefrog. [=

      Confira o caminho da página loginErro.xhtml se está corretamente descrito no web.xml. Verifique também o se o nome do arquivo está correto. Lembre-se que no java loginErro.xhtml é diferente de LoginErro.xhtml (dois modos que você escreveu o nome aqui).

      Quando ao perder a formatação eu não imagino o que pode estar acontecendo. Valide se os imports do CSS estão correto e se eles não estão sendo bloqueados. [=

      Obrigado pela visita.

      • Resolvi o problema referente ao j_security_check, refiz as páginas usando apenas tags html. Já após o login ser efetuado com sucesso, ele continua redirecionando a raiz da aplicação http://localhost:8080/ws/, tem ideia de como resolver isso?

        Agradeço novamente!

        • Matheus, boa tarde.

          Pode ser alguma configuração do Glassfish.

          Infelizmente não tenho como te ajudar nesse caso.

          Boa sorte. [=

  11. Oi, estou implementando seu código, porém o método SecurityAssociation acusa um erro, creio que seja porque não uso o Jboss e sim Glashfish.
    Dei uma pesquisada e não encontrei esse método no glashfish =/
    vc sabe de outra maneira que funcione no glashfish? =P

    Mais uma vez, obrigado!

    • Carlos, bom dia.

      Infelizmente não sei te falar qual o método relativo ao Glassfish.

      Procure algo como “JAAS Glassfish” no google. [=

      Obrigado pela visita.

  12. Olá Heber,

    Teria como vc mostrar como seria a configuração do datasource usando o mySQL?

    Outra coisa, como uso uma API, a senha que é usada no banco de dados é criptografada utilizando uma série de processos hash. Tenho tudo isso implementado, porém eu não consigo ver onde eu posso estar manipulando o campo password antes de manda-lo ao LoginFilter. Como eu poderia estar manipulando o password (passando pelo algoritmo hash de verificação que já tenho pronto) antes de manda-lo ao LoginFIlter?

    • Marcos, boa tarde.

      Para o MySQL você pode realizar o mesmo código trocando apenas os dados de conexão e o JAR utilizado.

      Basta procurar no google JDBC URL MySQL e pronto. [=

      A questão da senha será simples caso você use alguma criptografia comum, por exemplo, MD5, SHA e assim vai.

      Basta procurar no google por: Jboss JAAS SHA

      Obrigado pela visita.

  13. Cara, Parabéns pelo post, me ajudou muito.

    Agora uma dúvida. Fui seguindo os seus passos para implementar JAAS em uma aplicação minha. Ela roda de boas e faz a autenticação como deveria fazer, mas porém quando eu acesso a tela de login diretamente, a tela é carregada como ela deveria ser, com imagens e css. Mas quando eu acesso uma tela sem estar autenticado, a tela de login é mostrada, porém sem css, sem imagens, sem labels, somente os campos para preenchimento de login, senha e o botão. Você já passou por uma caso como este? É alguma coisa que fiz de errado?

    Valew! E parabéns mais uma vez.

    • Erick, boa noite.

      Não será por que seus arquivos de css/imagens estão dentro da parte segura do site?

      Obrigado pela visita.

      Me perdoe a demora em responder, realmente estou muito ocupado nesses dias. =/

      • Opa, magina cara.

        Então, o meu css e imagens estão dentro das pastas resources.css e resources.imagens, e não é este o problema, pois se acesso direto pela url da página de login, minha página é apresentada normalmente, com imagens e css.
        O erro somente acontece quando a página de login é requerida pelo JAAS. =(
        Estranho tbem que tudo relacionado às tags h:algumaCoisa não são mostradas quando chamadas pelo JAAS, como por exemplo os labels da tela.

        Valew!

        • Erick, boa noite.

          Realmente está muito estranho isso.

          Sua página de login está em um local protegido pelo JAAS? Ou está em algum lugar público?

          Obrigado pela visita.

          • Erick, boa noite.

            Eu teria que analisar eu código mais detalhadamente.

            Poste seu código no GUJ que, caso não eu, alguém te ajudará.

            Desculpe não acertar o problema. =/

          • Magina cara, já me ajudou muito com o post sobre JAAS. Qdo voltar a mexer com este problema vou postar no guj.

            Obrigado!

          • Parabéns pelo post uaihebert…

            Meu problema é exatamente o mesmo do Erick, quando acesso a página de login diretamente pelo browser renderiza certo a página de login, porém se tento acessar uma página protegida sem ta autenticado o JAAS me apresenta a tela de login mas os componentes h:algumaCoisa não são mostrados corretamente.

            Fui dar uma olhada no html gerado pela página e percebi que esses componentes h:algumaCoisa estão lá e não foram convertidos para html pelo JSF, é como se o redirecionamento para o login feito pelo JAAS não estivesse passando pelo ciclo do JSF para interpretar as tags e converter em html.

            Você conseguiu resolver o problema Erick?

          • Geraldo

            Se você baixar o projeto esse problema não acontece. (pelo menos não com o ambiente onde ele foi criado)

            Veja se a URL para qual é redirecionada dispara o contexto do JSF.

            Obrigado pela visita.

    • Manoel, boa tarde.

      Basta fazer um botão que chame um método que execute o método invalidate() do httpSession. [=

      Obrigado pela visita.

  14. Oie , Boa tarde, excelente seu post, parabens.
    Estou tentando seguir o tutorial usando o tomcat 7 , acredito que seja quase tudo igual né?
    O que deve mudar é a parte de configuração referente ao servidor certo? porem não acho nada na net para o tomcat, você poderia me ajudar? teria algum exemplo?

    Grata

    Janaina Meira

    • Janaina, boa tarde.

      Para o Tomcat não é a mesma coisa, na verdade você teria que implementar seu próprio Módulo de JAAS. Algo que dará um trabalhinho de se fazer. [=

      Infelizmente não tenho nenhum material para te indicar no momento.

      Obrigado pela visita.

  15. Hebert, parabéns pelo post e pelo livro!

    Configurei como falou, mas sempre que tento logar ele informa o erro de login. Já verifiquei no BD, está tudo ok. Onde pode estar o erro?

    Outra pergunta: eu preciso necessariamente desta classe de filtro? Digo pois no JBoss 7 nunca tinha visto…

    • Bruno, boa tarde.

      Infelizmente não tenho como te ajudar sem olhar melhor seu código e erro.

      Poste-o no GUJ que se eu não ajudar, alguém o ajudará.

      Obrigado pela visita.

      • Boa tarde,

        no JBoss EAP 6.1 não tem a pasta server e nem o arquivo login-config.xml …
        Você sabe onde deve inserir as configurações do llogin-config.xml?

        • Olá Rafael,

          Infelizmente não sei te falar pois tive quase nenhum contato com essa versão.

          Desculpe não poder te ajudar.

          Tente procurar no google por: “login-config.xml” jboss eap 6.1

          Até mais.

  16. Erick, vc conseguiu resolver esse problema do css?
    Estou com o mesmo problema que vc, a pagina de login esta em uma area publica assim como os resouces (images e css).
    Mas quando faço o logout e redireciono para a pagina de login o os resources (images e css) não são carregados.

    • Olá Tiago,

      Infelizmente não consegui resolver, tive outras prioridades, e ainda tenho outras, então decidi deixar minha tela só com os campos necessários, e sem css, mas ainda pretendo voltar e ver o que acontece para solucionar este erro.

  17. Boa noite, parabéns pelo post, me ajudou muito!

    Estou com um pequeno problema.. Na página de login que criei, adicionei alguns componentes do primefaces, porém estes não ficam com o estilo do primefaces (tema)..

    Existe alguma maneira de contornar esse problema?
    abraços!

    • Emerson, boa tarde.

      1) Você pode deixar a página de login em um local de acesso público.
      2) Não utilizar o primefaces diretamente na página de login.
      3) Customizar o JAAS.

      Obrigado pela visita.

      • Boa noite, obrigado pela ajuda, consegui resolver o problema acima…

        Estou com outra dúvida… No meu caso, criei uma página para fazer o login ou cadastrar um novo usuário. Ao criar esse novo usuário, ele seria redirecionado para uma outra página, onde iria completar seu cadastro, fazer compras, etc…

        Para poder redirecioná-lo para essa página, preciso adicioná-lo na sessão do JAAS manualmente. Já pesquisei um pouco e não encontrei alguma explicação sobre como fazer isso…
        Pode me dar uma dica para resolver essa questão?

        Muito obrigado pela atenção!

        • Emerson, boa tarde.

          Nesse caso você teria que criar seu próprio modulo do JAAS.

          Infelizmente eu ñ tenho nenhum tutorial em mãos que mostra como fazer isso.

          Obrigado pela visita.

  18. Olá Hebert.

    Muito bom o post, parabéns!
    Tenho 2 dúvidas:

    – Em relação a JAAS com Jboss, o método que você utilizou é o mais recente, ou já atualizaram para alguma versão com annotations, ou algo parecido?
    – No caso, esse post é sobre autenticação. Para autorização, seria +/- a mesma linha de raciocínio?

    Muito obrigado, e mais uma vez, parabéns pela iniciativa!

    Att,
    André Ferso.

    • André, boa tarde.

      Autorização seguiria a mesma linha, o acesso já pode ser feito via URL ou então você poderia anotar métodos com anotações do @EJB para proteger de acesso indevido.

      Anotações pura do JAAS infelizmente não sei te falar se existem.

      Obrigado pela presença.

  19. Muito bom seu blog.. muito bom mesmo. Você poderia fazer uma validaçao de login com TOMCAT, sei que ja tem em outro post. Mas la voce nao utiliza JAAS.

    • Nesken, bom dia.

      Quem sabe um dia eu escreva JAAS com Tomcat. Por enquanto está fora da minha rota de estudo, pois é algo específico do Tomcat. [=

      Obrigado pelo pela visita.

    • João, boa tarde.

      Eu não digo que existe uma abordagem melhor ou pior nesse caso. Existe sim uma que seja mais adequada ao seu caso.

      No caso do JSF você poderia utilizar JAAS, Filter ou PhaseListener. Te aconselho a olhar cada uma e ver a que melhor se encaixa no seu projeto.

      Obrigado pela visita.

        • Bruna, boa tarde.

          Em poucas palavras é dificil de explicar. Você tem a variável de qual servidor está usando, de qual framework está usando, quais requisitos de segurança você terá e assim vai. =/

          Tentando resumir eu diria que: Se for optar pelo mais simples, eu diria que o filter é o mais simples. Se o JSF não está barrando requests ajax, teria que ser PahseListener. Se você precisa de controle de perfil de usuário por funcionalidade eu diria JAAS caso seu servidor dê suporte, se não der eu diria SpringSecurity ou CDI na mão.

          Espero ter ajudado.

  20. Cara,

    estou seguindo este tutorial para aprender a mexer
    melhor com jboss e essas coisas…

    no meu projeto encontro um erro na linha:
    import org.jboss.security.SecurityAssociation;

    realmente não sei porque, não acha este import.
    Vi um forum no GUJ onde surgiu o mesmo problema,
    porém não chegaram a nenhuma solução
    http://www.guj.com.br/java/272789-problema-no-import-do-securityassociation

    gostaria de saber se alguém sabe o que é…realmente não
    consegui corrigir.

    • Pardal, boa noite.

      Como não obtive resposta da pessoa que criou o tópico eu não sei te falar se o que fui sugerido lá foi a solução.

      Obrigado pela visita.

        • Olá Ilton, boa noite.

          Se você seguir passo a passo, inclusive com a mesma versão do JBoss, você não terá problemas.

          Obrigado pela visita.

  21. Boa tarde, fiz o passo a passo da app, porém quando tento logar no recebo esse erro, Login failure: javax.security.auth.login.FailedLoginException: PB00019: Processing Failed:No matching username found in Principals poderia me ajudar ? desde já agradeço muito sua atenção.

    • Olá Carlos, boa noite.

      Não sei falar exatamente qual o erro, posso falar que tem alguma configuração em XML que está faltando.

      Obrigado pela visita.

  22. Boa tarde, Herbert!

    Estou seguindo teu tutorial. Tá muito bacana, parabéns!

    Então…
    Quando o usuário digita o login errado e clica em “voltar”, no navegador, aparece o formulário de login novamente. Daí, quando o usuário informa o login e senha (corretos) é apresentado o erro 403… E, a partir dessa página, não consigo mais ir para página alguma, nem mesmo para a página de login.

    Teve esse mesmo problema? Alguma sugestão de como posso resolver esse problema?

    Obrigado! Abraço.

    • Manoel, bom dia.

      Na verdade não tive esse erro.

      Creio que a solução seria capturar o erro e tentar fazer o redirect para a página de home, caso o login fosse com sucesso.

      Obrigado pela visita.

  23. Boa tarde!

    Implementei tudo conforme este tutorial mas minha aplicação está redirecionando direto pra página de erro, após eu digitar o usuário e senha. Não está passando pelo filtro. Procurei outros fóruns na internet e as configurações que fiz está de acordo conforme todas as explicações.
    O que poderia ser?

    • Marcelo, boa tarde.

      Honestamente não sei te falar de cabeça.

      Eu diria que é algum XML com problema.

      Obrigado pela visita.

  24. Hebert, no meu caso eu preciso de um controle de funcionalidades por usuário por exemplo:
    Usuario A -> Tela Clientes (Visualiza, Cria, Altera, Exclui), Tela Produtos (Visualiza, Cria, Altera, Exclui)
    Usuario B -> Tela Clientes (Visualiza, Cria), Tela Produtos (Visualiza)
    Usuario C -> Tela Fabricantes (Visualiza, Cria)

    Onde entrariam as funcionalidades nesse caso? Seriam roles? Ou o JAAS não é o mais indicado? O que me recomenda?

    • Claudinei, bom dia.

      Seriam as roles sim. Você poderia utilizar o JAAS sem problema, assim como outros frameworks de login.

      Crie uma classe onde você verifica qual a ROLE do usuário e o envia para lá.

      Obrigado pela visita.

  25. Olá Herbert, boa noite.

    Minha aplicação esta tudo certo.

    Utilo: Eclipse Luna + Wildfly 8.2
    Especificações: JSF 2.2 + CDI + EJB3 + Hibernate(JPA)

    Minha aplicação esta rodando perfeitamente.
    Mas quando vou fazer a autenticação via Formuário de Login, não acontece nada.
    Apenas altera a URL pelo Request mas volta pra mesma página de Login.

    Queria que ao fazer login, o usuário fosse redirecionado para determinada página.

    Como posso fazer isso ?

    Vlw

    • Felipe, boa tarde.

      Me desculpe a demora, estive muito ocupado nesse último mês.

      Talvez você esteja fazendo a chamada por ajax e não por um http submit normal. Ou pode ser que está acontecendo algum erro, mas ele não está exibindo na tela de login. Infelizmente o erro está muito genérico para mim.

      Obrigado por tudo e desculpe a demora.

  26. Oi Hebert!
    Utilo: Eclipse Luna + JBOS 7.0 Não consigo encontrar o caminho :

    /JBOSS_QUE_VC_DESCOMPACTOU/server/default/conf/. para o arquivo “login-config.xml”

    • Liborio, boa tarde.

      Se você notar, a versão do JBoss utilizada no post é a 6.

      Se você seguir todos os passos do Post, você vai conseguir.

      Att,

Leave a Comment