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:
Parabens Bruno!!!
Eh um otimo sistema de login OO
Muito claro e elegante
Muito bom!
Simples e prático!
Parabéns.
E as declarações do host, username e senha?
Tinha pensado em serem strings mesmo. Mas nada impede de serem implementadas classes para isso. É só um exemplo básico.
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...
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.
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.
Clareando o que disse acima. Faltou o encapsulamento...............fui hehehe
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"
Ismael, entao de alguma dica ao invez de apenas criticar ^^
substitua:
login='$usuario' and senha='$senha'");
por:
login='" . mysql_escape($usuario) . "' and senha='" . mysql_escape($senha) . "'");
Parabens pelo sistema de login, facil e descomplicado. Muito bom mesmo
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.
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
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.
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..
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
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 !
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']).
É mais orientada à classe que à objeto.
Mas tá bom.
Achei legal ... Bem simples e prático. Quanto a segurança - Cabe a quem vai utilizá-lo melhorar. Idéia bacana!
Parabéns...
Gostei!
Pratico e objetivo.
Mto vezes precisamos de um exemplo assim porem enchem de linguiça.
So tem alguns símbolos faltando '$' ')'
Parabéns !
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.
Com relação a restrição de dados podemos restringir-los de forma dinâmica em javascript
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!!!
Brother, qual a necessidade da função getNome no inicio do script?
Não entendi a necessidade dessa função no mesmo...
Postar um comentário