Você está na página 1de 6

Autenticao com PHP e Postgres

Bom pessoal, essa a minha segunda aula sobre PHP e hoje veremos como efetuar uma operao de login utilizando o Postgres. Para este tutorial necessrio que tenha o Postgres e o pgAdmin instalado, e saiba conceitos bsicos de Orientao a Objetos. Para comear, vamos dividir a estrutura do nosso aplicativo em 3 camadas, de acordo com o padro MVC (Model View Controller). Um Pouco sobre MVC MVC um Design Pattern (Padro de Projeto) estrutural. Ele divide o aplicativo em 3 camadas onde: M = Model (Responsvel pela conexo com o Banco de Dados) V = View (Apresentao para o usurio) C = Controller (Responsvel pela lgica) Algumas regras: Todo e qualquer acesso ao Banco de dados deve ser feito atravs da camada Model. A View responsvel pela apresentao ao usurio. O controller deve fazer a comunicao entre a View e o Model. Ele solicita os dados para a camada Model, processa, e envia para a View. Tendo esses conceitos definidos, vamos montar a nossa estrutura. Esse tutorial foi criado em ambiente linux, portanto crie um novo diretrio com o nome appAuth na pasta definida pelo seu Apache para os sites, no linux /var/www Dentro dela Criaremos a seguinte estrutura:

Uma coisa bastante chata no PHP so os caminhos relativos que voc precisa definir quando est incluindo arquivos ao seu script. Por exemplo, se voc estiver no diretrio controller/ e precisar incluir um arquivo que est em model/ voc pode inseri-lo desta forma: require_once '../model/arquivo.php'; Esta linha importa um arquivo para o seu script usando o caminho relativo. O ../ volta um nvel no diretrio e entra em model/ trazendo o aquivo.php. Desta forma os caminhos dos require`s ou include`s ficariam confusos muito facilmente. Imagine o seguinte caminho: require_once '../../../model/arquivo.php'; ou

require_once '../../../../../../../../model/arquivo.php'; Por esse motivo eu costumo usar o mtodo do PHP set_include_path() no inicio do meu script. Ele inclui paths da sua aplicao temporariamente ao php.ini apenas para a execuo do seu script. Na pasta root da nossa aplicao crie o arquivo init.php e insira o contedo abaixo: <?php /** * Incluindo os paths dos diretorios usados na aplicao */ $model_path = dirname(__FILE__).DIRECTORY_SEPARATOR.'model'; $controller_path = dirname(__FILE__).DIRECTORY_SEPARATOR.'controller'; $view_path = dirname(__FILE__).DIRECTORY_SEPARATOR.'view'; set_include_path(get_include_path() . PATH_SEPARATOR . $model_path . PATH_SEPARATOR . $controller_path . PATH_SEPARATOR . $view_path ); Em cada uma das variveis, estamos inserindo o caminho absoluto do path para cada camada da aplicao: model= /var/www/appAuth/model/ controller = /var/www/appAuth/controller/ view = /var/www/appAuth/view/ Desta forma, em qualquer parte do nosso aplicativo podemos chamar qualquer arquivo do model, view ou controller de forma mais legivel e livre de erros: require_once 'model/arquivo.php'; Aps este passo, vamos inserir o init.php no arquivo index.php, que o arquivo que ser executado por padro ao nosso site ser requisitado. <?php require_once 'init.php';

A Camada Model:

Primeiramente, vamos criar a nossa tabela de usurios para que possamos fazer a insero e verificao. CREATE TABLE usuario ( id_usuario serial NOT NULL, nome character varying(70) NOT NULL, usuario character varying(15), senha character varying(8), CONSTRAINT usuario_pkey PRIMARY KEY (id_usuario) ) Na pasta model/, vamos criar o arquivo Conexao.php. Para fins didticos, vamos abrir mo de algumas boas prticas de desenvolvimento e segurana. Isso ficar para outro post. <?php Class Conexao { private static $instance = null; private private private private $host = 'localhost'; $dbName = 'appAutentica'; $user = 'postgres'; $password = 'postgres';

private $sock = null; private function __construct() { } public static function getInstance() { if (Conexao::$instance == null) { Conexao::$instance = new Conexao(); } return Conexao::$instance; } public function conectarDB() { $this->sock = pg_connect("host=$this->host user=$this>user password=$this->password dbname=$this->dbName") or die("No foi possvel conectar"); } public function close() { pg_close($this->sock); $this->sock = null; }

function autentica($usuario, $senha) {

$this->conectarDB(); $sql = "SELECT * FROM usuario WHERE usuario = '$usuario' AND senha = '$senha'"; $result = pg_query($this->sock, $sql); $user = pg_fetch_assoc($result); $this->close(); if($user) return true; else return false; } } Temos aqui a classe Conexo. Ela um Singleton. Daremos uma ateno especial ao mtodo autentica(), que recebe duas strings, monta a sql e envia para o banco. Basicamente, o que ele faz perguntar para o banco se existe algum usurio com o login e senha recebidos por parmetro. Em caso positivo, ele retorna o booleano true, caso contrrio retorna false. Como j temos agora o nosso ponto de conexo com o banco de dados, vamos trabalhar na camada Controller. A Camada Controller: Como dito anteriormente, a camada Controller alm de possuir a lgica do aplicativo, ela atua como um intermedirio entre o Model e a View. Crie um arquivo chamado Autenticacao.php em /controller. Com esta classe, vamos trabalhar com mtodos estticos, porque para o nosso propsito no necessrio o uso de objetos. <?php require_once 'model/Conexao.php'; class Autenticacao { public static function autentica($usuario, $senha) { $retornoOk = Conexao::getInstance()->autentica($usuario, $senha); return $retornoOk; } } O cdigo acima importa a classe Conexao.php. Como ela um Singleton, pegamos a sua instncia nica atravs do mtodo getInstance e executamos o mtodo autentica do Model. Adicionamos o resultado da operacao na varivel booleana $retornoOk e a retornamos para quem a solicitou. A Camada View:

No nosso exemplo, farei com que a view faa as chamadas para o controller. Aqui ela ter um pouco de voz ativa para exigir que tipo de tratamento ela precisa, mas isso pode ser feito de vrias outras formas. Vamos trabalhar no arquivo index.php. <?php session_start(); require_once 'init.php'; require_once 'controller/Autenticacao.php'; $usuario = isset($_POST['tx_login']) ? $_POST['tx_login'] : ''; $senha = isset($_POST['tx_senha']) ? $_POST['tx_senha'] : ''; if (!empty($usuario) && !empty($senha)) { $autenticado = Autenticacao::autentica($usuario, $senha); if ($autenticado) { $_SESSION['autenticado'] = true; die("Autenticacao efetuada com sucesso"); } else { die("A autenticacao falhou."); } } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <form id="frmLogin" name="frmLogin" action="index.php" method="post"> Login <input name="tx_login" maxlength="15"/> Senha <input name="tx_senha" maxlength="15"/> <input type="submit" name="btn_submit" value="Ok"/> </form> </body> </html> Este aquivo index.php est dividido em duas partes. A primeira aonde ele faz a requisio para o Controller verificar se o usurio e senha digitado pelo usurio esto corretos. Se sim exibida a mensagem Autenticacao efetuada com sucesso, se no, A autenticacao falhou. A segunda parte um formulrio HTML com os campos Login e senha. O action deste form o

prprio index.php, e as variveis do formulrio so recuperadas atravs da varivel $_POST. Abraos e at a prxima. Daniel Bonfim daniel.fb88@gmail.com Graduando em Sistemas de Informao Unijorge