Fala pessoal!
Hoje acordei cedo e resolvi criar um novo artigo explicando como se faz um sistema de login passo-a-passo, que nem eu fiz o tutorial sobre como funciona o upload e validação de arquivos no PHP.
O meu intuito nesse artigo não é entregar um script pronto mas sim te mostrar o “caminho das pedras” enquanto você é quem criará o seu próprio sistema.
Versões utilizadas nesse artigo: PHP 5.2.9 e MySQL 5.0.5.
O nosso sistema consistirá em um login simples, validado por usuário e senha (encriptada) contra uma tabela no banco de dados e armazenando os dados na sessão. Haverão dois níveis de acesso para os nossos usuários: normal (1) e administrador (2).
Criando a Tabela MySQL
Você pode executar esse código MySQL para criar a nossa tabela de usuários que tem 7 campos: id, nome, usuario, senha, niveis, ativo e cadastro:
CREATE TABLE IF NOT EXISTS `usuarios` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `nome` VARCHAR( 50 ) NOT NULL , `usuario` VARCHAR( 25 ) NOT NULL , `senha` VARCHAR( 40 ) NOT NULL , `email` VARCHAR( 100 ) NOT NULL , `nivel` INT(1) UNSIGNED NOT NULL DEFAULT '1', `ativo` BOOL NOT NULL DEFAULT '1', `cadastro` DATETIME NOT NULL , PRIMARY KEY (`id`), UNIQUE KEY `usuario` (`usuario`), KEY `nivel` (`nivel`) ) ENGINE=MyISAM ;
Com isso você já tem uma tabela pronta para o nosso tutorial… Rode esse script se quiser alimentar a tabela com alguns usuários de teste:
INSERT INTO `usuarios` VALUES (NULL, 'Usuário Teste', 'demo', SHA1( 'demo' ), 'usuario@demo.com.br', 1, 1, NOW( )); INSERT INTO `usuarios` VALUES (NULL, 'Administrador Teste', 'admin', SHA1( 'admin' ), 'admin@demo.com.br', 2, 1, NOW( ));
Como vocês podem perceber, o nosso campo de senha tem 40 caracteres e quando cadastramos os usuários testes usamos SHA1(‘{senha}’) isso significa que usaremos uma senha encriptada… Se você quiser saber mais sobre sha1 veja esse artigo: Criptografia no PHP usando md5, sha1 e base64.
O formulário de Login em XHTML
Vamos criar agora o nosso formulário que será onde o visitante entrará com os dados e será mandado para a pagina validacao.php onde os dados serão validados (ohh).
<!-- Formulário de Login --> <form action="validacao.php" method="post"> <fieldset> <legend>Dados de Login</legend> <label for="txUsuario">Usuário</label> <input type="text" name="usuario" id="txUsuario" maxlength="25" /> <label for="txSenha">Senha</label> <input type="password" name="senha" id="txSenha" /> <input type="submit" value="Entrar" /> </fieldset> </form>
Como esse artigo não é uma aula sobre formulários e método POST eu vou pular a parte que fala sobre os names desses inputs e a relação deles com o PHP em si.
A validação dos dados
Já temos o banco de dados e o formulário de login… Agora vamos começar a fazer a validação. Os próximos códigos deverão ser colocados dentro do validacao.php que irá tratar os dados recebidos do formulário:
Primeiro de tudo nós precisamos verificar se o usuário de fato preencheu algo no formulário, caso contrário mandamos ele de volta para o index.php:
<?php
// Verifica se houve POST e se o usuário ou a senha é(são) vazio(s)
if (!empty($_POST) AND (empty($_POST['usuario']) OR empty($_POST['senha']))) {
header("Location: index.php"); exit;
}
?>
Com isso, todo código que vier depois desse if estará seguro de que os dados foram preenchidos no formulário.
Agora nós iremos abrir uma conexão com o MySQL mas essa conexão pode ser feita de outra forma, até antes do if se você preferir… Depois de abrir a conexão nós iremos transmitir os dois valores inseridos pelo visitante (usuário e senha) para novas variáveis e usaremos o mysql_real_escape_string() para evitar erros no MySQL.
<?php
// Verifica se houve POST e se o usuário ou a senha é(são) vazio(s)
if (!empty($_POST) AND (empty($_POST['usuario']) OR empty($_POST['senha']))) {
header("Location: index.php"); exit;
}
// Tenta se conectar ao servidor MySQL
mysql_connect('localhost', 'root', '') or trigger_error(mysql_error());
// Tenta se conectar a um banco de dados MySQL
mysql_select_db('usuarios') or trigger_error(mysql_error());
$usuario = mysql_real_escape_string($_POST['usuario']);
$senha = mysql_real_escape_string($_POST['senha']);
?>
Agora é hora de validar os dados contra a tabela de usuários:
<?php
// Verifica se houve POST e se o usuário ou a senha é(são) vazio(s)
if (!empty($_POST) AND (empty($_POST['usuario']) OR empty($_POST['senha']))) {
header("Location: index.php"); exit;
}
// Tenta se conectar ao servidor MySQL
mysql_connect('localhost', 'root', '') or trigger_error(mysql_error());
// Tenta se conectar a um banco de dados MySQL
mysql_select_db('usuarios') or trigger_error(mysql_error());
$usuario = mysql_real_escape_string($_POST['usuario']);
$senha = mysql_real_escape_string($_POST['senha']);
// Validação do usuário/senha digitados
$sql = "SELECT `id`, `nome`, `nivel` FROM `usuarios` WHERE (`usuario` = '". $usuario ."') AND (`senha` = '". sha1($senha) ."') AND (`ativo` = 1) LIMIT 1";
$query = mysql_query($sql);
if (mysql_num_rows($query) != 1) {
// Mensagem de erro quando os dados são inválidos e/ou o usuário não foi encontrado
echo "Login inválido!"; exit;
} else {
// Salva os dados encontados na variável $resultado
$resultado = mysql_fetch_assoc($query);
}
?>
Repare que estamos buscando registros que tenham o usuário igual ao digitado pelo visitante e que tenham uma senha igual a versão SHA1 da senha digitada pelo visitante… Também buscamos apenas por registros de usuários que estejam ativos, assim quando você precisar remover um usuário do sistema, mas não pode simplesmente excluir o registro é só trocar o valor da coluna ativo pra zero.
A consulta gerada fica mais ou menos assim:
SELECT `id`, `nome`, `nivel` FROM `usuarios` WHERE (`usuario` = 'a') AND (`senha` = 'e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98') AND (`ativo` = 1) LIMIT 1
Depois de rodar a consulta (query) nós verificamos se o número de resultados encontrados (ou não) é diferente de um, caso seja é exibida uma mensagem de erro acompanhada de um exit que finaliza o script… Caso ele encontre apenas um resultado nós temos o nosso usuário e já puxamos o seu ID, nome e nível de acesso do banco de dados.
Salvando os dados na sessão
Agora nós precisamos salvar os dados encontrados na sessão pois eles serão utilizados mais tarde, em outras páginas e eles precisam “persistir” até lá… Depois de salvar os dados na sessão nós iremos redirecionar o visitante para uma página restrita:
if (mysql_num_rows($query) != 1) {
// Mensagem de erro quando os dados são inválidos e/ou o usuário não foi encontrado
echo "Login inválido!"; exit;
} else {
// Salva os dados encontados na variável $resultado
$resultado = mysql_fetch_assoc($query);
// Se a sessão não existir, inicia uma
if (!isset($_SESSION)) session_start();
// Salva os dados encontrados na sessão
$_SESSION['UsuarioID'] = $resultado['id'];
$_SESSION['UsuarioNome'] = $resultado['nome'];
$_SESSION['UsuarioNivel'] = $resultado['nivel'];
// Redireciona o visitante
header("Location: restrito.php"); exit;
}
Verificando se o usuário está logado
Nosso sistema de login está quase completo! Agora só precisamos verificar se o usuário está logado no sistema e se o seu o nível de acesso condiz com o da página… Vamos agora escrever um pequeno bloco de PHP no início do arquivo restrito.php (que só deve ser acessado por usuários logados):
<?php
// A sessão precisa ser iniciada em cada página diferente
if (!isset($_SESSION)) session_start();
// Verifica se não há a variável da sessão que identifica o usuário
if (!isset($_SESSION['UsuarioID'])) {
// Destrói a sessão por segurança
session_destroy();
// Redireciona o visitante de volta pro login
header("Location: index.php"); exit;
}
?>
<h1>Página restrita</h1>
<p>Olá, <?php echo $_SESSION['UsuarioNome']; ?>!</p>
Pronto meu amigo! O seu sistema de login está pronto para funcionar… Só vamos fazer alguns incrementos para ele ficar mais “usável”… Agora você vai ver como fazer a verificação de usuário logado e de nível de acesso, por exemplo para uma página onde apenas os administradores possam ter acesso:
<?php
// A sessão precisa ser iniciada em cada página diferente
if (!isset($_SESSION)) session_start();
$nivel_necessario = 2;
// Verifica se não há a variável da sessão que identifica o usuário
if (!isset($_SESSION['UsuarioID']) OR ($_SESSION['UsuarioNivel'] < $nivel_necessario)) {
// Destrói a sessão por segurança
session_destroy();
// Redireciona o visitante de volta pro login
header("Location: index.php"); exit;
}
?>
Código de Logout
O arquivo logout.php é tão simples que pode ter uma linha só:
<?php session_start(); session_destroy(); header("Location: index.php"); exit; ?>
Ou se você preferir, uma versão mais extensa:
<?php
session_start(); // Inicia a sessão
session_destroy(); // Destrói a sessão limpando todos os valores salvos
header("Location: index.php"); exit; // Redireciona o visitante
?>
–
Quem não conseguir fazer um sistema de login depois dessa aula não vai ganhar batata frita no fim do dia!
Pra quem quiser, aqui tem um RAR para download com os arquivos desse artigo.
–
Veja aqui como criar um sistema de login usando classes (Orientação a Objetos) e que funciona no PHP 4 e PHP 5.
Você também vai gostar de ler:
- Criando um sistema de login com PHP e MySQL
- Sistema de logins com classe no PHP – Como usar?
- Criando um sistema de logins com classe no PHP – Parte 2
- Criando um sistema de logins com classe no PHP – Parte 1
- Sistema de busca em PHP e MySQL com paginação
Postado em Artigos, MySQL, PHP, Tutoriais
Com as tags ACL, Artigo, Banco de Dados, Busca, Classe, Classes, Código, Conexão, Controle de Acesso, Criptografia, Download, empty, Erros, Formulário, Header, HTML, INSERT, Login, Max, MySQL, Níveis de Acesso, Orientação a Objetos, Password, PHP, PHP 5, Proteção, Resultados, Root, Script, Scripts, Segurança, Senha, Servidor, Sessão, Session, Sistema, SQL, Submit, Tutorial, Upload, Validação, Variáveis, XHTML
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:

Muito bem explicado, parabens!!! Todos os seus tutorias são muito bons
Thiago, muito bom seu script, bem explicado e gostaria de agradeçer pelo conteúdo, realmente foi bem escrito e serviu de muita utilidade para quem quer aprender sobre o conteúdo!!! Parabéns!!! Você me ajudou muito … tenho um amigo que queria aprender a fazer um sistema de login e seu Artigo foi sensacional!!! Ele não só conseguiu desenvolver o sistema dele como fez as modificações de acordo com suas características…
Muito bom também você está sempre respondendo as dúvidas dos usuários, isso é muito importante brother! Você está de parabéns!!!
Boas! ^^
Abraço Alexandre
Muito bom Thiago, usei alguns comandos para complementar meu sistema de login… Obrigado!
Thiago, parabéns pelo site, tudo muito legal, muito bem feito e caprichado, visitei bastante coisa, e considero o teu site um exemplo. Vou tentar aprender um pouco por aqui. Obrigado e abraços.
Posso dar uma sugestão? Não entendo nada de PHP, e estou querendo criar uma página bem simples, onde eu (admin), cadastro os usuarios manualmente (só login e senha), e terei uma página individual para cada usuário com informações só para ele (precisaria ser gerada de forma simples, pois quem vai fazer a inclusão de dados é uma pessoa leiga em programação, vai ser algo assim: uma agenda de serviços, ela inclui uma data e um status de como está o serviço…como uma lista..e sempre vai atualizando), e o cliente verifica através de sua senha e login como anda seu processo.
Deve ser simples, não é? Que tal um tutorial assim? Serviria para muitas pessoas (Alunos, escritorios de advocacia, contabilidade, etc…)
Quando escrevi meu comentário, colocando minha dúvida, em momento algum tive a intenção de por em dúvida a qualidade de seu script. Ao contrário, sou leitor assíduo de seu blog, leio todos os artigos. Minha dúvida é se existe a possibilidade de uma configuração do php interferir no registro da sessão no servidor, pois, como afirmei no primeiro comentário, a sessão não é inicializada. Espero ter escrito de maneira clara e não-ofensiva. Obrigado
@Leandro
Peço desculpa se respondi de forma “ofensiva”, não foi minha intenção também… Só quis dizer que o script funciona normalmente e provavelmente é erro humano… Teste-o em outro site, sem muita programação.
Ola..Consegui os codigos tudo..Mas onde jogo tudo isso para ir pro meu BLOG
@Matheus
Como assim? O.o
Caro Thiago, sou trabalho com html a alguns anos e agora estou me aventurando em php, ainda não tenho muito conhecimento… Fiz um teste do sistema aqui explicado, mas a sessão simplesmente não funciona e sempre volta para a página de login. Já tentei quase tudo. Usando o Xdebug, descobri que a sessão nunca é iniciado, mesmo que eu utilize o session_start(), tanto no script de login, quanto no arquivo de verificação do login do usuário. Isso pode ser erro na escrita do script? Desde já agradeço a ajuda recebida.
@Leandro
O script foi testado por mim e por outras pessoas e funcionou perfeitamente… Verifique se você está fazendo tudo certo e se o seu servidor não tem alguma restrição/má configuração nas sessões..
Muito bom Tutorial
Olha só, consegui colocar o código e adicionar os usuários no banco de dados que estãoi assim,
11 – administrador – admin – d033e22ae348aeb5660fc2140aec35850c4da997 – admin@demo.com.br – 2 – 1 – 2009-08-07 12:57:37
10 – usuario – senha – 7751a23fa55170a57e90374df13a3ab78efe0e99 – usuario@demo.com.br -1 – 1 – 2009-08-07 12:56:14
quando eu acesso a página index.php para logar e coloco
usuário = administrador
senha = admin
aparece login inválido, vc sabe me dizer o que pode estar acontecendo?
Obrigado!
@Delano
O usuário é admin e a senha é admin também… “administrador” é só o NOME do usuário, não o usuário de login.
Parabéns, sou um leigo em php e sql, entendo algumas coisas pois tenho uma noção de lógica e C, criei um formulário e consegui cadastrar usuários com senha mas na hora de logar só aparece Login inválido, e quando eu olho no banco de dados tem o login e senha cadastrados mas no campo cadastro os dados são iguais para todos os usuários (0000-00-00 00:00:00) não sei se isso é certo.
coloquei o código que vc havia dito mas não deu certo.
INSERT INTO `usuarios` (`id`, `nome`, `usuario`, `senha`) VALUES (NULL, ‘NOME’, ‘USUARIO’, SHA1(’SENHA’));
Bom, vc manda bem, será que vc pode nos ajudar enviando o código de um cadastro para que possamos entender melhor.
Obrigado!
kra, muito legal isso. Tentei varios exemplos de login, mas nenhum funcionou. O seu além de funcionar ainda está muito bem explicado. Com poucas modificações consegui adaptar para meu site.
Obrigado!
Certo agora sim deu certo, mas uma pequena duvida, e se eu quizesse desencryptar essa senha como faria?
@Rodrigo
Não pode.. MD5 e SHA1 são encriptações de mão unica (one-way), leia mais aqui:
http://blog.thiagobelem.net/php/2009/03/11/criptografia-no-php-usando-md5-sha1-e-base64-323/
Consegui ate fazer o furmalio e ele envia todos os novos dados para o Banco de dados, porem quando vou fazer login ele da rro de login, acho que seja por causa do SHA1 correto?
@Rodrigo
Na hora de salvar o registro do “novo” usuário no sistema você faria como o exemplo que está no artigo:
INSERT INTO `usuarios` (`id`, `nome`, `usuario`, `senha`) VALUES (NULL, ‘NOME’, ‘USUARIO’, SHA1(‘SENHA’));
Ola Thiago muito bom mesmo seu site, mas a minha duvida é a mesma que a do Pedro, por usar SHA para cryptar as senhas, nao sei como fazer o formulario de cadastro, pode nos passar um exemplo? Obrigado
Muito bom thiago, mas como eu faria uma pagina de cadastro de usuarios?
@Pedro
Procure sobre tutoriais básicos de PHP e MySQL.
Legal..
desculpe mais uma duvida, como faria para o administrador ter acesso a todas as pagina inclusive a pagina que usuario tem acesso como nivel 2?
Obrigado
@Edson
Repare que a regra está “>=” isso permite que usuários com nível maior ao necessário continuem tendo acesso à página em questão.
Parabens, muito legal e facil de entender
só uma duvida..o logout,necessito criar um botão para ele ou apenas colocar no final da pagina restrita e depois de algum tempo logado ele desloga?
Obrigado
Edson
@Edson
O melhor é você criar um botão/link mesmo.
Então, esse é o problema…rs nao consegui fazer.
A ideia é que o usuário 1, acesse a pasta http://www.meusite.com.br/cliente 1
que o usuário 2, acesse a pasta http://www.meusite.com.br/cliente 2
que o usuário 3, acesse a pasta http://www.meusite.com.br/cliente 3
Com toda a pasta protegida, entende?
Se o usuario 1 digitar o endereco do cliente 2, tem que dar bloqueado e pedir o login….
Não consegui direcionar o usuario 1 para o site 1, o 2 para o site 2, o 3 para o site 3 com nenhum exemplo que pesquisei na net…
Pode me ajudar?
Muito obrigado
@Silvio
Isso é uma particulariedade do seu sistema… Proteção de pasta inteira (incluindo arquivos pra download) só com validação de usuarios via htaccess (Apache)… Procure sobre isso.
Abraços
Boa tarde.
Estou fazendo um teste, gostaria de uma informação:
usuario 1, nivel 1 acessa site 1
usuario 2, nivel 2 acessa site 2
Como fazer para que o usuario 3, nivel 3 acesse o site 3?
Grato.
@Silvio
É só cadastrar o usuário com nivel 3 e verificar isso na validação que acontece antes da página restrita como foi mostrado no ultimo exemplo…
Show de bola, muito bom mesmo. Bem explicado. Parabéns.