Aplicação Web Completa JSF EJB JPA JAAS

View – Criando e configurando o JSF

Vamos criar um novo projeto Dynamic Web Project. Configure-o conforme as imagens abaixo :

Atenção, em algum momento o Eclipse irá te perguntar se você quer adicionar as capacidades do JSF (auto complete), diga que sim. Uma tela como a tela abaixo irá aparecer:

Após finalizar a criação, vamos editar nosso arquivo web.xml que deve ficar como o arquivo abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>CrudJSF</display-name>
	<welcome-file-list>
		<welcome-file>pages/protected/user/listAllDogs.xhtml</welcome-file>
	</welcome-file-list>
	<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>
		<url-pattern>*.jsf</url-pattern>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>

	<!-- Protected area definition -->
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>Restricted Area - ADMIN Only</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>Restricted Area - USER and ADMIN</web-resource-name>
			<url-pattern>/pages/protected/user/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>USER</role-name>
			<role-name>ADMIN</role-name>
		</auth-constraint>
	</security-constraint>

	<!-- Login page -->
	<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>

	<!-- System roles -->
	<security-role>
		<role-name>ADMIN</role-name>
	</security-role>
	<security-role>
		<role-name>USER</role-name>
	</security-role>
</web-app>

Não se importe caso apareça algum warning/erro, nós iremos resolver daqui a pouco. Repare também que já adicionei todo o código do JAAS que vamos precisar. (Caso queira uma explicação mais detalhada sobre JAAS visite este post: Login de Usuário com JSF e JAAS)

De acordo com o JAAS um usuário normal poderá apenas os arquivos que estiverem dentro da pasta user, que será apenas a listagem dos cachorros cadastrados; o ADMIN poderá realizar os procedimentos do CRUD completo, pois as páginas do CRUD estarão dentro do seu diretório.

O arquivo faces-config.xml deve ficar como abaixo:

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

<faces-config
    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"
    version="2.0">

	<navigation-rule>
		<navigation-case>
			<from-outcome>logout</from-outcome>
			<to-view-id>/pages/protected/user/listAllDogs.xhtml</to-view-id>
			<redirect/>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<navigation-case>
			<from-outcome>listAllDogs</from-outcome>
			<to-view-id>/pages/protected/user/listAllDogs.xhtml</to-view-id>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<navigation-case>
			<from-outcome>createDog</from-outcome>
			<to-view-id>/pages/protected/admin/createDog.xhtml</to-view-id>
			<redirect/>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<navigation-case>
			<from-outcome>updateDog</from-outcome>
			<to-view-id>/pages/protected/admin/updateDog.xhtml</to-view-id>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<navigation-case>
			<from-outcome>deleteDog</from-outcome>
			<to-view-id>/pages/protected/admin/deleteDog.xhtml</to-view-id>
		</navigation-case>
	</navigation-rule>

	<application>
		<resource-bundle>
			<base-name>messages</base-name>
			<var>msgs</var>
		</resource-bundle>
	</application>

</faces-config>

Repare que para algumas ações eu utilizei o comando <redirect/>. Esse comando é necessário para que o JAAS possa captar e atualizar a URL solicitada pelo usuário, com isso ele irá barrar o acesso indevido.

Temos também um arquivo que irá conter todas as mensagens da nossa aplicação. Veja que todos os textos exibidos no projeto se encontram dentro dele (crie um arquivo chamado “messages.properties” dentro da pasta “src”):

#Dog
dog=Dog
dogName=Name
dogWeight=Weight

#Dog messages
dogCreateHeader=Create a new Dog
dogUpdateHeader=Update the Dog
dogDeleteHeader=Delete this Dog
dogNameRequired=The dog needs a name.
dogWeightRequired=The dog needs a weight.

#Actions
update=Update
create=Create
delete=Delete
cancel=Cancel

#Login
loginHello=Hello
loginErrorMessage=Could not login. Check you UserName/Password
loginUserName=Username
loginPassword=Password
logout=Log Out

241 Thoughts on “Aplicação Web Completa JSF EJB JPA JAAS

  1. Marcos Filho on April 26, 2013 at 6:38 pm said:

    Olá Hebert, como ficaria esse protected T findOneResult(String namedQuery, Map parameters)

    e public User findUserByEmail(String email)

    sendo que em Hibernate, já rodei aqui para tentar implementar utilizando a mesma ideologia que vc usou mais até agora nao obtive sucesso.

    • uaihebert on April 29, 2013 at 7:35 pm said:

      Marcos, boa tarde.

      Do modo como se encontra no projeto ele está funcionando.

      Caso você tenha alguma exception após realizar alguma alteração poste o código no guj que ficará mais fácil de ajudar.

      Obrigado pela visita.

  2. Pingback: 1389 Ideias para aplicativos Android – GUJ | S60Aplicativos

  3. Roger on April 15, 2013 at 1:25 pm said:

    Hebert, boa tarde.

    Parabéns pelo post.

    Só uma dúvida. A estrutura que você propõe pode gerar um inconveniente na aplicação. Se você atualizar a página gerará um “re-post” no seu CRUD. Já pensou em implementar o padrão POST-Redirect-GET para resolver o problema?

    • uaihebert on April 20, 2013 at 8:21 pm said:

      Roger, boa noite.

      Esse patern é bom de ser utilizado, não o coloquei no post para não adicionar mais complexidade para quem está começando agora. [=

      Obrigado pela visita e pelo apoio.

  4. Cara parei na parte “adicione o EJB no JBoss”, adicionei, criei o crudDB no Postgres, executei o JBoss e nada, nenhuma tabela foi criada.
    Sou iniciante, segui todos os passos certinho até aqui, mas não deu certo.
    Eu uso Linux, Eclipse Indigo, JBoss 7 e Postgres 9.1.18

  5. Marcos Fontana on March 18, 2013 at 4:41 pm said:

    Hebert, boa tarde.

    Estou recebendo o seguinte erro quando autenticado pelo servidor:

    HTTP Status 408 – The time allowed for the login process has been exceeded. If you wish to continue you must either click back twice and re-click the link you requested or close and re-open your browser.

    Já procurei algumas soluções e nada de me ajudarem. Teria alguma solução mais explicita para aumentar o tempo de sessão para o Login? (acho que é esse o problema).

    Obrigado!

    • uaihebert on April 4, 2013 at 8:17 pm said:

      Marcos, boa noite.

      Nunca tomei esse erro.

      Baixe o projeto aqui do post e tente executá-lo.

      Obrigado pela visita.

  6. Só pra complementar na linha 58 do código:
    Query query = em.createNamedQuery(namedQuery);

    // Method that will populate parameters if they are passed not null and empty
    if (parameters != null && !parameters.isEmpty()) {
    populateQueryParameters(query, parameters);
    }

    result = (T) query.getSingleResult();

    Existe sim um método tipado,
    TypedQuery javax.persistence.EntityManager.createNamedQuery(String arg0, Class arg1)

    • uaihebert on April 4, 2013 at 8:15 pm said:

      Diogo, boa tarde.

      Na época que criei esse post eu conhecia apenas o JPA 1.0 e não havia o método tipado.

      O TypedQuery veio com o JPA 2.0 que vim aprender algum tempo depois.

      Obrigado pela visita. [=

  7. Bruno on March 4, 2013 at 10:02 am said:

    Hebert, mais uma dúvida:

    No seu exemplo, listalldogs.xhml já estava no diretório protected, logo ao tentar acessar esta página o JAAS chama a página de login, que após validado já redireciona para a página desejada (listalldogs.xhtml). Porém, como faço, sendo a página de login a primeira por exemplo, para após o login, redirecionar para uma outra página qualquer?

    • uaihebert on March 4, 2013 at 12:37 pm said:

      Bruno, bom dia.

      Olhe no arquivo de web.xml tem o welcome-page que indica qual a página de login.

      Quando o usuário acessar http://localhost:8080/suaAplicacao após login ele será direcionado para a página demarcada lá.

      Caso você queira um controle mais refinado, como caso ADM envie para página A se for usuário para a página B, você teria que criar um módulo de JAAS.

      Até mais.

Comment navigation

 

Leave a Reply

Post Navigation