Autenticação PHP para múltiplos usuários usando MySQL

Página PHP que necessitaríamos para realizar um acesso restringido por chave e senha para múltiplos usuários, onde cada um tenha seus dados de acesso próprios, que se salvam no banco de dados.

Por Miguel Angel Alvarez - Tradução de JML


Publicado em: 03/3/08
Valorize este artigo:
Veremos as páginas PHP que necessitaríamos para realizar um acesso restringido por chave e senha para múltiplos usuários, onde cada um tenha uns dados de acesso próprios.

Nota: Este artigo vem a complementar o manual Sistema de Autenticação em PHP. De fato, neste artigo só vamos tratar a página que percorre os dados do usuário (seu nome e senha) e comprova se são corretos, redirecionando à aplicação segura (se os dados se correspondem com algum usuário do banco de dados), ou à página de entrada (se os dados não correspondem com nenhum usuário registrado).


O primeiro é lembrar o esquema de páginas do sistema de autenticação proposto. O podemos ver no artigo Funcionamento do sistema de autenticação em PHP. Nós vamos tratar de colocar aqui um código para a página "comprovo dados"

O banco de dados

O banco de dados que vamos utilizar conterá uma tabela para os usuários, onde cada um irá dispor, pelo menos, de dois campos: um nome de usuário e uma senha, os dois de tipo texto.

Tabela usuário
Nome do campo Tipo do campo
nome_usuario Texto
chave_usuario Texto

Em um banco de dados de usuários, o nome de usuário deveria ser um valor único, que não se repita para outro usuário, ou seja, não poderemos ter dois usuários com o mesmo nome. Por esta razão, o campo nome_usuario poderia ser a chave principal da tabela, embora também poderíamos ter criado um campo adicional, chamado por exemplo id_usuario, de tipo autonumérico e colocá-lo como chave principal.

Para conseguir não inserir dois usuários com o mesmo nome de usuário, na hora de inseri-los na tabela, comprovaremos que não tenha nenhum usuário já introduzido com o nome de usuário que se pretende inserir. Este passo, embora seja importante, não o veremos, pois só nos centraremos em decidir se um usuário pode entrar ou não na aplicação, supondo que os usuários se encontram já inseridos no banco de dados.

No exemplo, supomos que utilizamos um banco de dados MySQL, entretanto, qualquer tipo de banco de dados poderá servir para uns objetivos como os que nos propomos.

O funcionamento do script

O script que se utilizará para decidir se um usuário pode ou não entrar na aplicação é muito simples. Simplesmente faz uma chamada ao banco de dados para comprovar se os dados de autenticação escritos pelo visitante (usuário e senha) correspondem com os de algum usuário. No caso de ser assim, se permite a entrada e de não ser assim, se denega.

Nota: Este script foi comentado em uma versão simplificada no artigo Controle dos dados de autenticação em PHP, englobado dentro do manual Sistema de autenticação PHP

O primeiro seria abrir uma conexão com o banco de dados e selecionar o banco com o qual vamos trabalhar.

//conecto com o banco de dados
$conn = mysql_connect("servidor","usuario","password");
//seleciono o BD
mysql_select_db("nome_bd",$conn);


Um segundo passo é construir uma instrução SQL que nos permita comprovar se existe ou não um usuário com os dados de autenticação introduzidos. Utilizamos uma simples instrução SELECT, sobre a tabela de usuários, onde se extraem usuários que tenham o mesmo nome de usuário e a senha introduzidos na página de acesso.

//Instrucao SQL para buscar um usuario com esses dados
$ssql = "SELECT * FROM usuario WHERE nome_usuario='$usuario' and chave_usuario='$senha'";

//Executo a instrucao
$rs = mysql_query($ssql,$conn);


Se essa instrução SELECT responde com algum registro encontrado, saberemos que existe um usuário onde seus dados de autenticação correspondem perfeitamente com os introduzidos. Nesse caso poderemos realizar as ações encaminhadas a permitir o acesso. Caso contrário, se a instrução SELECT não encontrar nenhum registro, saberemos que não existe um usuário com os dados de autenticação introduzidos e portanto, deveremos realizar as ações encaminhadas a restringir o acesso.

if (mysql_num_rows($rs)!=0){
    //usuario e senha válidos
    //defino uma sessão e salvo dados
    session_start();
    session_register("autenticado");
    $autenticado = "SI";
    header ("Location: aplicacao.php");
}else {
    //se nao existe lhe mando outra vez ao portal
    header("Location: index.php?errousuario=sim");
}


As ações para restringir ou permitir o acesso são exatamente iguais as que vínhamos utilizando no script de controle sem utilizar o banco de dados. Portanto, não vamos comentá-las mais, e sim lhes referimos ao artigo onde as explicamos.

O código completo do exemplo seria o seguinte.

<?
//conecto com o banco de dados
$conn = mysql_connect("servidor","usuario","password");
//seleciono o BD
mysql_select_db("nome_bd",$conn);

//Instrucao SQL para buscar um usuario com esses dados
$ssql = "SELECT * FROM usuario WHERE nome_usuario='$usuario' and chave_usuario='$senha'";

//Executo a instrucao
$rs = mysql_query($ssql,$conn);

//vemos se o usuario e senha são validos
//se a execucao da instrucao SQL nos da algum resultado
//eh que sim que existe essa conbinacao usuario/senha
if (mysql_num_rows($rs)!=0){
    //usuario e senha validos
    //defino uma sessao e salvo dados
    session_start();
    session_register("autenticado");
    $autenticado = "SI";
    header ("Location: aplicacao.php");
}else {
    //se nao existe lhe mando outra vez ao portal
    header("Location: index.php?errousuario=si");
}
mysql_free_result($rs);
mysql_close($conn);
?>


Nota: É importante destacar que esta página não deveria conter nenhum tipo de texto antes da abertura de código PHP, nem sequer quebras de linha. Isto é devido a que ao final se realiza um redirecionamento e este tipo de instruções somente se pode executar se não se escreveu ainda nenhum caractere no corpo. Para ser mais específicos, este é o erro que obtemos se escrevemos antes na página de enviar os cabeçalhos:

Warning: Cannot add header information - headers already sent by (output started at /htdocs/exemplos/autentic-php_bd/controle.php:2) in /htdocs/exemplos/autentic-php_bd/controle.php on line 26





Comentários do artigo
Foram enviados 2 comentários ao artigo
2 comentários não revisados
0 comentários revisados

Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato