domingo, junho 03, 2007

Sistema de Login com PHP orientado a objetos

Olá a todos. Peço desculpas pelo tempo sem postagens. Ultimamente tem sido muito corrido para mim. Por isso gostaria de aproveitar a oportunidade para abrir esse espaço a todos os que gostariam de contribuir com o blog com tutoriais e artigos.

Desta vez vamos desenvolver um sistema de autenticação com PHP usando orientação a objetos. Vamos precisar de três arquivos: um arquivo para conter a classe Usuário, outro para realizar a autenticação e fazer o redirecionamento e uma página HTML que vai conter o formulário. Pois bem, mãos à obra.

A classe de usuário. Essa classe vai ficar no arquivo usuario.php


< ?php
class Usuario {
var $nome, $senha;

function getNome() {
return this->nome;
}

function Usuario($nome,$senha) {
$this->nome = $nome;
//A senha será submetida a um hash, que
é uma criptografia sem volta.
$this->senha = md5($senha);
}

function autentica() {
//Aqui estara o metodo de acesso ao banco.
$nome = $this->nome;
$senha = $this->senha;
$query = "SELECT nome, senha FROM usuarios WHERE nome=$nome
AND senha=$senha";
$resultados = mysql_query($query) or die(mysql_error();
if (mysql_num_rows($resultados)>0) {
$this->geraSessao($this);
return true;
}
else{
return false;
}
}

function geraSessao($usuario) {
session_start();
$_SESSION['usuario'] = $usuario;
}
}
?>



A página HTML:


< HTML>
< HEAD>
< TITLE>Login< /TITLE>
< /HEAD>

< BODY>
< form action="autentica.php" method="post">
< input type="text" name="nome" />
< input type="password" name="senha" />
< /form>
< /BODY>
< /HTML>


A página que vai fazer a autenticação dos dados vindos da página HTML:


< ?php
include("usuario.php");
$nome = $_POST["nome"];
$senha = $_POST["senha"];
var usuario = new Usuario($nome,$senha);
if (usuario->autentica()) {
header("location:principal.php");
}
else {
header("location:login.php");
}
?>


Bom pessoal, esta é uma idéia de um sistema de autenticação. Hábitos de segurança como gravar os dados de senha no banco como um hash são importantes e devem ser usados. Postem dúvidas, sugestões e melhorias para o código. Não testei o sistema. É apenas um tutorial didático, mas de qualquer forma, não custa estudar e testar. No caso de acessar o banco, não esqueçam de escrever um método de conexão.

É isso aí pessoal. Até a próxima.

29 comentários:

esparta disse...

Parabens Bruno!!!
Eh um otimo sistema de login OO
Muito claro e elegante

Leandro disse...

Muito bom!
Simples e prático!

Parabéns.

Anônimo disse...

E as declarações do host, username e senha?

Bruno Nunes disse...

Tinha pensado em serem strings mesmo. Mas nada impede de serem implementadas classes para isso. É só um exemplo básico.

Anônimo disse...

para mim não funcinou...
trava no linha onde você instancia o metodo autentica a class Usuario na variavel usuario com os atributos $nome e $senha...

Bruno Nunes disse...

Como disse, eu não testei esse tutorial. Eventualmente pode haver algum erro ou bug, mas o foco principal do artigo é msotrar a idéia de um sistema OO em PHP.

Anônimo disse...

Legal, mas cadê a proteçao das classes, metodos, e atributos. Na minha opiniao orientaçao a objetos sem isso nao é orientaçao a objetos. A titulo de iniciaçao tá fraco mas tá bom.

Anônimo disse...

Clareando o que disse acima. Faltou o encapsulamento...............fui hehehe

Ismael Goncalves disse...

Classe com falha de segurança - SQL Injection.
Os dados $usuario e $senha nao sao tradados, podendo receber quaisquer valores.
Ex:
Usuario: eu
senha: %27 or 1=%27 1--
Fica algo assim:
"Select nome, senha FROM usuarios WHERE nome='eu' AND senha='' OR 1=1"

Unknown disse...
Este comentário foi removido pelo autor.
Anônimo disse...

Ismael, entao de alguma dica ao invez de apenas criticar ^^

Anônimo disse...

substitua:
login='$usuario' and senha='$senha'");

por:
login='" . mysql_escape($usuario) . "' and senha='" . mysql_escape($senha) . "'");

Amauri disse...

Parabens pelo sistema de login, facil e descomplicado. Muito bom mesmo

Anônimo disse...

Então, achei desnecessário os atributos, logo que tudo isso será destruido quando abrir a página, então para que deixar algo na memória do servidor que não vai ser usado depois?
Acho que deveriam ser métodos estáticos, apenas realizam processos lógicos com argumentos recebidos.

Anônimo disse...
Este comentário foi removido por um administrador do blog.
Bruno Nunes disse...
Este comentário foi removido pelo autor.
Márcio disse...

rodei o exemplo, sabem pq deu este erro:
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in C:\Inetpub\vhosts\cogmas.com\httpdocs\php\autentica.php on line 6

Unknown disse...

Legal, mas Orientação a Objeto em PhP ainda está muito fraca, comparado a Java por exemplo, mas isto deve-se aos programadores, outra coisa e que as más particas também contaminam outras linguagens como Ruby e Python.

Anônimo disse...

ta legalzinho.. mais nao tem nenhuma proteçao sobre sql injection...

e se o cara na hora de faze login deixar o nome em branco e colocar a senha ' or 1=1' , o que sera que vai acontecer?

descubram vcs mesmo...

mais ta ae a dica... fica mais ligado em questao de segurança..

Anônimo disse...

Ae Bruno vc está de parabéns, sou bacharel em SI e especialita em TI, iniciativas como essa devem ser apreciadas ao invés de criticadas, apesar de ter suprimido alguns conceitos, como foi mencionado por vc só é uma base sobre OO, os interessados tem que naturalmente correr atrás de outras fontes e os críticos paciência, tomem alguma iniciativa...

Att,

Eleuson Ferreira Miranda
Analista em TI
obnitchwhitford@hotmail.com

Humberto Barbosa disse...

achei bem legal acho só vejo que você pode usar private $nome,$senha;
em vez de var.
e na query para nao sofrer injection tem modo bem facil é assim
$query = "SELECT nome, senha FROM usuarios WHERE nome='".$nome."'
AND senha='".$senha."'";

entendeu? só colocar aspas e aspas simples o maximo que ira acontecer se tentarem um injection e um erro de sql.

no mais está ótimo
parabéns !

Anônimo disse...

Olha, o Ismael falou de Sql Injection, porém não atentou que o felipe faz a criptografia da senha antes de inseri-la na String Sql, somente quanto ao nome do usuário isso faria efeito. e é simples de corrigir se usar a função do php $usuario = addslashes($_POST['usuario']).

L0g4N disse...

É mais orientada à classe que à objeto.
Mas tá bom.

Salu disse...

Achei legal ... Bem simples e prático. Quanto a segurança - Cabe a quem vai utilizá-lo melhorar. Idéia bacana!

Parabéns...

Anônimo disse...

Gostei!
Pratico e objetivo.
Mto vezes precisamos de um exemplo assim porem enchem de linguiça.
So tem alguns símbolos faltando '$' ')'
Parabéns !

Leandro Peres disse...

Para quem quiser, a classe de conexão para poder rodar esse script criado pelo nosso amigo.

usuario.php

var $nome, $senha;
// CONEXÃO
var $usuario = "";
var $pw = "";
var $servidor = "127.0.0.1";
var $db = "";

function conecta() {
mysql_connect($this->servidor, $this->usuario, $this->pw) or die(mysql_error());
mysql_select_db($this->db) or die(mysql_error());
}

Na página autentica, chamar:
$Usuario = new Usuario ($nome,$senha);
$conectar = $Usuario->conecta();

Abraço.

Anônimo disse...

Com relação a restrição de dados podemos restringir-los de forma dinâmica em javascript

Dalson disse...

Oloko meu!!!!

O cara postou um codigo na boa vontade mostrando pra iniciante como autenticar com OO em PHP, e os cara ainda reclama. Eu vejo tanto mané fazendo classe sem estar com OO, veio... e vem me falar "meu sistema ta todo em OO". Classe não é necessariamento OO. Vai pegar esses caras que perguntaram de proteção e o caramba, se o código dos cara ta estruturado certinho. Tá nada!!! fica achando defeito em vez de pegar e fazer o seu.

Voces vejam esse codigo e façam as suas adaptações, e parem de reclamar e vão estudar.

Valew Bruno!!!

Unknown disse...

Brother, qual a necessidade da função getNome no inicio do script?
Não entendi a necessidade dessa função no mesmo...