Archive

Archive for the ‘JavaEE’ Category

 Powered by Max Banner Ads 

Criando um pool de conexão JEE/TomCat

May 22nd, 2010 camilolopes 2 comments

olá Pessoal,

O post desta semana é sobre pool de conexão, veremos como usar em uma aplicação JEE. Apesar de ter o mesmo efeito de fecharmos de forma programatica uma conexão, mas nem sempre esta ultima é melhor, principalmente em produção uma conexão pode ficar aberta, outra vem a ser aberta e por ai vai até estourar o nosso BD. E para retornar o normal tem que ter dar um restart no tomcat. Imagine em dar um restart no servidor em produção por causa disso?

Até a implementação do pool de conexão é bem lógico e bem refatorado, basta ter o JNDI e pronto. Quando precisar alterar vamos em um local e aonde o JNDI é referenciado já está atualizado (obvio).

Lets go…

Posts recomendados:

MySql + Java

Criando dynamic web project

Pool de Conexão

O pool de conexão é usado do lado do servidor independente da IDE que você está usando, porém cada servidor e IDE tem suas config especiais para o uso do Pool, ou seja, no tomcat é de uma forma, no Jboss eh outra, no glassfish também. E na IDE Netbeans pode mudar, que ele organiza um projeto JEE levemente diferente da IDE eclipse. Mas, nada que o programador precise “comprar um livro” para esse fim.

Requisitos:

Tomcat 5.5/superior – Instalação

Eclipse
MySql – 5.x

Antes de colocar mão na massa certifique-se que você tem o conectar 5.x.jar MySql . Pois, vamos precisar dele em nosso projeto JEE.

  1. crie um novo dynamic web project
  2. Abra o arquivo web.xml e na aba Tree clique em Resources.
  3. Precisamos adicionar uma referência para isso clique em add e deixe conforme abaixo:

< resource-ref>
    < res-ref-name>jdbc/blog
    < res-type>javax.sql.DataSource
    < res-auth>Container
  < /resource-ref>
  1. O name pode ser qualquer um, como jdbc/nomequevcquer
  2. crie um package para conexão br.com.conexao

  3. Agora crie uma classe chamada Conexao com o método a seguir:

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class Conexao {

	public static Connection getConnection() throws Exception{

		InitialContext context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/blog");

		try {

			return ds.getConnection();
		} catch (SQLException e) {

			throw new Exception(e.getMessage());
		}}}
  1. o método lookup tem como objetivo buscar o jdni que criamos no web.xml

Configurando o config BD no TomCat

  1. crie um arquivo em META-INF chamado context.xml
  2. Aqui vamos passar as configurações do BD para o JNDI que criamos, ou seja, jdbc/blog. Vamos informar qual usuário/senha e schema do BD aquele JNDI deve conectar.


	

Então podemos ter vários JNDI em um mesmo context.xml com usuários/senha + schema diferentes. Isso ajuda quando precisar fazer alterações de teste para produção, basta mudar em um lugar. E pronto.

A JNDI é uma API para acesso a serviços de diretórios que permite aplicações cliente descobrir e obter dados ou objetos através de um nome. A API JNDI é utilizada em aplicações Java para acessar recursos externos, como banco de dados, filas ou tópicos JMS e componentes da plataforma Java EE. (Edson Gonçalves).”

Adicione ao projeto o driver do BD na pasta lib. Lembre-se de copia-lo fisicamente para o eclipse, ou seja, saia do eclipse e copie o .jar, pois o eclipse não faz isso automaticamente quando add via library da própria IDE.

Testando

Para testar vamos criar um simples servlet que vai estabelecer a conexão e se der tudo tudo certo, não veremos nenhuma exceção e será impresso uma mensagem.

Mas, antes disso criamos uma pagina .jsp que chama o servlet. Fizemos isso para ser mais rápido e e simples. Já que precisamos apenas saber se o nosso pool está funcionando corretamente.

Servlet.java

  1. crie um package br.com.servlet

  2. Crie um servlet TesteAPP conforme abaixo:

public class TesteAPP extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public TesteAPP() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		try {
			Conexao.getConnection();
			System.out.println("conexão estabelecida com sucesso");

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}}

note: Se usou o assistente do eclipse para criar um servlet, fique atento se não mudou o <url-pattern> . Caso não tenha feito este leva o mesmo nome da class Servlet.

Index.jsp

Apenas encaminha a solicitação para o servlet TesteAPP

Execute o projeto, e veja o resultado esperado.



Note: Não esqueça de verificar se o Banco de dados foi iniciado. Ou seja, deu start no BD? Senão vai receber uma exceção: Communication failure link

Simples não? Vou ficando por aqui e espero que tenham gostado do post.

Abraços, see you next post. :) .

Segurança JEE Realm FORM TomCat

April 19th, 2010 camilolopes 3 comments

olá Pessoal,

Hoje vou falar de um assunto que todos os desenvolvedores, arquitetos etc. tem que se preocupar ao desenvolver uma aplicação é a famosa segurança. Você como “profissional do software” tem que saber quem vai ter acesso a determinadas partes da sua aplicação e o que ele pode fazer após ter concedido o acesso.

Dizer  se o usuário “camilo” for um simples “user” ele só pode navegar nas seguintes pages: “index.jsp, faleconosco.jsp etc”. Agora vamos dizer que o usuário “lopes” é um dos administradores do sistema, então ele pode acessar as páginas “cadastrarprodutos.jsp, deletarusuario.jsp que estão em /admin” etc.

Como fazer isso Camilo?

Bem, o objetivo deste post é dar um suporte quem está entrando agora no mundo JEE, hoje temos frameworks que ajudam de forma mais eficiente que usar Realm do TomCat. Mas, não pretendo ir além do Realm. Só ele dar um big post.

Alguns iniciantes em JavaEE, tem essa dúvida consigo: como implementar regra de acesso sem precisar fazer um hard-code?”

Fazer isso dentro do seu servlet, controller etc. não é boa ideia pelo simples motivo: “as regras de segurança podem mudar com bastante frequência”. Como por exemplo amanha você precisa adicionar um novo nível de administrador (sênior, pleno) e cada um com permissões diferentes. Mas, também pode acontecer de um novo grupo fazer parte da administração os “gerente de projetos” ai lá vai o desenvolvedor atualizar o code e se amanhã deixar de existir algum dos citados? Já viu o prolema que temos ao implementar regras de segurança dentro do seu servlet, controller etc.

Os iniciantes em JEE, põe tudo que for restrito dentro de WEB-INF, isso não é boa prática.

As regras de segurança referente acesso é algo que pode ser simples, mas também complexo, vai depender da regra de negócios da aplicação. Por exemplo, já vi aplicações que tem vários tipos de administradores, usuários, com acessos completamente diferentes, porém no mesmo nível. Mas, colocar em WEB-INF todos as suas pages .jsp. Vc deve se perguntar: “é seguro a quem?”.

Vamos parar de conversa e veremos na prática…

lets go…

Realm

Realm é um depósito de informações de usuário que autentica e autoriza os usuários.Usando realms, você põe a responsabilidade no servidor Web por obrigar a implementar políticas de segurança. Isto significa que os desenvolvedores não precisam escrever código para usar autenticação e autorização (não que isso os impeçam de fazê-lo). Delegando autenticação e autorização ao servidor, os desenvolvedores podem escrever códigos de propósitos gerais, sem preocupação com as regras de autorização de acesso. (Livro – Tomcat – Guia Rápido do Administrador)

Para esse exemplo vamos usar um dos mais populares container JEE o TomCat (versão 6). Se você estiver usando um container diferente, terá que ler a documentação do fabricante e saber como implementar. Porém há poucas mudanças na maioria das vezes.

Posts Recomendado:

Requisitos:

  • Eclipse (usarei o Galileo)

  • TomCat 6 (se tiver a 5.x.x sem problemas, pode usar)

Aqui vamos implementar sem usar dados vindo do BD. Então veja como uma forma de praticar “Segurança” até porque sem BD, vc vai precisar sempre ficar atualizando o arquivo tomcat-users.xml e se você não usar criptografia, qualquer um pode abrir esse arquivo e saber as senhas de cada usuário.

Desenvolvendo

  1. Crie um dynamic web project no Eclipse e deixe ele conforme a imagem a seguir. O meu chama RealmCamilo no decorrer do post, estarei informado o que teremos em cada page .jsp.

  2. Na página acessonegado.jsp insira o código a seguir:

    E-mail/Senha inválido.Tente novamente  />
  3. Na página index.jsp deixe conforme abaixo

     Acessar minha conta
  4. agora na pagina index.jsp dentro de /admin deixe assim:

    Está é uma página de conteúdo restrito. :)

Até aqui nada de especial. Agora que começa a segurança.

  1. Primeiro ponto é você deixar o tomcat parado e ir no caminho a seguir (caso tenha instalado no modo default):

    C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf

  2. Abra o arquivo server.xml

    Precisamos dizer ao TomCat que vamos habilitar o Realm, a linha vem comentada, para isso tire o comentário da linha a seguir:

    <Realm className=”org.apache.catalina.realm.MemoryRealm”/>

  3. Salve e feche o arquivo

  4. Agora vá no arquivo tomcat-users.xml no mesmo diretório do arquivo server.xml.

    Nesse arquivo criamos os usuários que terão acesso aplicação e qual role ele pertence.

    rolecode

  5. Não é muito difícil de ler, veja:

    “lopes É-UM manager. Porém, admin e camilo são um manager e admin.”

  6. O relacionamento aqui é one-to-many, nao se esqueça disso. Ou seja, um usuário pode ter mais de um nível de acesso.

  7. Lembre-se isso ai só são strings. O poder deles está quando criamos as restrições no arquivo web.xml.

Criando as regras de acesso

Agora precisamos criar as regras de acesso, dizer o que um “manager” pode acessar e o que um “admin”pode acessar.

  1. Abra o arquivo web.xml da sua aplicação.

webxml

Antes do primeiro código você precisa saber disso:

  • <security-constraint>: Protege um recurso, ou seja, diz o que será protegido e quem pode acessar.

  • <auth-constraint>: Isto especifica os roles que são permitidos acessar recursos cobertos por esta limitação de segurança.

  • <web-resource-collection>: sub-elemento de <security-constraint> que diz o que será registro.

  • <login-config>: diz qual o tipo de autenticação. Há quatros tipos: BASIC, DIGEST, FORM, SSL.

Para o nosso exemplo usaremos o FORM. O BASIC ele usa a caixa de autenticação do browser.

  1. insira o código abaixo no seu arquivo web.xml


Atenção:

Agora tenha atenção com o código de <login-config> Muitos confundem, achando que se o login/senha estiver OK. Vá para a página que está em <form-login-page> , mas ali que temos nenhuma condição IF.

O segredo é que antes de ir para tela de login, vc precisa ter tentando acessar o conteúdo restrito(na realidade é isso que acontece, pense um pouquinho…), assim o servidor vai saber o que fazer com vc que acessar caso seu login/senha válido, ou seja, enviar você para a página que foi solicitada (requested).

Se você, tentar direto para página de login, sem tentar acessar um conteúdo restrito, como o servidor vai saber encaminha-lo? Já que no action do form não há nada que diz “vá para pagina XYZ”.

  1. veja o código do form login.jsp

    Login
    Usuario: Senha:
  2. O atributo name, action deve ser com os nomes acima. Caso contrário, nada funciona como esperado. E nao esqueça que o método deve ser post, pois é um FORM.

Eu tenho o hábito de dizer: “Primeiro erre, para depois acertar”. Ou seja, primeiro tente acessar se não conseguir use seu login/senha. O máximo que vai receber é dizer que você não tem permissão para acessar.

Testando

*não esqueça dos starts/stops que você deve dar sempre que atualizar os arquivos .xml do tomcat.

Para testar vamos fazer um deploy da nossa app. Vamos usar um arquivo WAR, se não sabe como exportar um projeto como WAR veja no post indicado no inicio do post.

Abaixo como ficou minha exportação:

Veja meus teste de acesso:

  1. Tentando com o usuário camilo


  2. Resultado:


  3. Tentando com o usuário lopes


  4. Resultado:


Agora é com você

Experimente testar acessando o conteúdo restrito direto, tente colocar usuário inexistente, ou usuário com roles diferentes ao acesso permitido. E para ficar uma mensagem de erro personalizada, crie suas proprias páginas de erro.

Bom ficando por aqui, acho que este foi um dos maiores posts que já escrevi e nao sou a favor de posts grandes, mas foi necessário. O assunto precisava ser detalhado e olha que nao fui tanto assim. Vi vários outros posts na internet porém os que encontrei estava resumido demais e para quem está dando os primeiros passos pode se tornar complicado o processo. Espero que tenham gostado.

Abraços, see you next post. :) .

Related Posts with Thumbnails