Fala pessoal, hoje vamos ver como se faz um sistema de login passo-a-passo.
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á 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, níveis, ativo e cadastro, como mostra a Listagem 1.
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 da Listagem 2 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 isso significa que usaremos uma senha encriptada.
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 página validacao.php onde os dados serão validados (ohh) como mostra a Listagem 3.
<!-- 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 em PHP
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, como mostra a Listagem 4.
<?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, como mostra a Listagem 5.
<?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, como mostra a Listagem 6.
<?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, como vemos na Listagem 7.
A consulta gerada fica mais ou menos como mostra a Listagem 7:
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 do PHP
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, como mostra a Listagem 8.
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 encontrados 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), como mostra a Listagem 9.
<?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, como mostra a Listagem 10.
<?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ó, como vemos na Listagem 11.
<?php session_start(); session_destroy(); header("Location: index.php");exit; ?>
Ou se você preferir, uma versão mais extensa (Listagem 12):
<?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
?>
Confira outros conteúdos:
Teste unitário com PHPUnit
PHP: Strings
PHP: Funções
Black November
Desconto exclusivo para as primeiras 200 matrículas!
Pagamento anual
12x no cartão
De: R$ 69,00
Por: R$ 54,90
Total: R$ 658,80
Garanta o desconto
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- 12 meses de acesso
Pagamento recorrente
Cobrado mensalmente no cartão
De: R$ 79,00
Por: R$ 54,90 /mês
Total: R$ 658,80
Garanta o desconto
- Formação FullStack Completa
- Carreira Front-end I e II, Algoritmo e Javascript, Back-end e Mobile
- +10.000 exercícios gamificados
- +50 projetos reais
- Comunidade com + 200 mil alunos
- Estude pelo Aplicativo (Android e iOS)
- Suporte online
- Fidelidade de 12 meses
- Não compromete o limite do seu cartão
<Perguntas frequentes>
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.