Nesta postagem vamos abordar a autenticação de usuários em um sistema PHP. Muitas vezes criamos sistemas que são responsáveis por rotinas privadas do cliente e por isso é necessário criar um controle no acesso ao sistema, para que só pessoas autorizadas possam se conectar a ele. Nesta postagem criaremos uma rotina de autenticação básica ao nosso sistema usando login e senha do usuário. Hoje existem muitas técnicas de conexão segura, mas para efeito de estudos usaremos uma conexão básica e em outras postagens vamos implementando novos recursos e tornando a autenticação mais segura.
Em resumo, o que faremos é uma página de autenticação onde o usuário vai informar seu login e senha e usaremos esses dados para fazer a validação no banco de dados. Se os dados forem autenticados passaremos uma mensagem de boas-vindas e um botão para se desconectar, senão direcionaremos ele de volta para a página de login informando o motivo do erro.
Vamos ao código, lembrando que estamos trabalhando em uma única página para efeitos de estudo e facilidade de teste quando você executar no seu servidor. A rotina de conexão é a mesma de outras postagens:
# primeiro vamos definir algumas constantes
# com as informações do Banco de Dados que
# usaremos para a conexão.
# Servidos do nosso banco de dados.
define( 'DB_HOST', 'localhost');
# Nome do banco de dados.
define( 'DB_NAME', 'teste');
# Usuário de acesso.
define( 'DB_USER', 'root');
# Senha de acesso.
define( 'DB_PASS', 'As190806##');
# Aqui montamos a string de conexão que será usada
# como parâmetro na chamada da classe PDO.
$srv = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME;
# Aqui vamos criar a conexão que permitirá o acesso
# ao BD e armazená-la na variável $instance que agora
# é um objeto PDO.
$instance = new PDO( $srv, DB_USER, DB_PASS );
Com essa rotina, já temos a conexão com o banco de dados disponível. Agora vamos ao código para a autenticação. A primeira coisa a fazer é iniciar a sessão com ‘session_start()’.
session_start();
Depois verificamos se o parâmetro ‘logout’ foi enviado, o que significaria que o usuário clicou no botão de desconectar. Se for esse o caso, apagamos a sessão atribuindo a ela um ‘array’ vazio como valor.
if( isset( $_POST['logout'] ) ) $_SESSION = array();
Recuperamos os dados do usuário para validação.
$user = filter_input( INPUT_POST, 'user' );
$pass = filter_input( INPUT_POST, 'pass' );
Agora o código de validação onde recuperamos os dados no Banco de Dados, caso o login seja válido, e comparamos a senha para ver se está correta. Nesta verificação informaremos ao usuário problemas com email e senha, ou se tudo estiver correto liberamos o acesso.
if( !isset( $_SESSION['user_login'] ) ) {
if( isset( $user ) AND !empty( $user ) ) {
$query = "SELECT * FROM users WHERE user_login = '" . trim($user) . "'";
$stm = $instance->query( $query );
$data = $stm->fetch(PDO::FETCH_OBJ);
if( $data ) {
# Existe o email informado
if( !strcmp( md5( $pass ) , $data->user_pass ) ) {
# a senha está correta então adicionamos os dados
# do usuário na sessãoe retornamos esses dados.
$_SESSION['user_login'] = $data->user_login;
$_SESSION['user_name'] = $data->user_name;
$_SESSION['time'] = time();
echo "Seja Bem vindo " . $_SESSION['user_name'] . "\n"
} else {
echo "Senha incorreta\n"
}
} else {
echo "Email não cadastrado\n"
}
} else {
# Não existe a sessão de usuário criada nem
# dados do usuário para tentar realizar o login.
echo "informe o login\n"
}
} else {
# Já existe a sessão de usuário criada então
# retornamos os dados da sessão liberando o acesso ao sistema.
$limit = 60;
$start = $_SESSION['time'];
$current = time();
$elapsed_time = $current - $start;
if( $elapsed_time < $limit ) {
$_SESSION['time'] = time();
echo "Seja Bem vindo " . $_SESSION['user_name'] . "\n"
} else {
$_SESSION = array();
echo "Tempo de acesso expirado" . "\n"
}
}
Quando um usuário for autenticado, armazenaremos alguns dados da conexão na sessão ($_SESSION) e usaremos esses dados para validar o ‘status’ da conexão. Por exemplo, armazenaremos o momento em que ele se conectou, em $_SESSION['time'], assim podemos controlar o tempo que a conexão ficou inativa e se tivermos um tempo máximo permitido para a inatividade, podemos realizar a desconexão. No nosso script usaremos valor de $_SESSION[user], para validar se o usuário já está conectado. Caso o valor esteja definido, é sinal de que tem uma conexão ativa e devemos dar acesso ao sistema. Com todas as verificações feitas, podemos executar o código responsável pela exibição das informações na tela.
if( !isset( $_SESSION['user_login'] ) ) {
echo "<form method='POST'>";
echo "<input name='user' type='text' placeholder='Informe o Login'>";
echo "<input name='pass' type='password' placeholder='Informe a Senha'>";
echo "<button type='submit'>Entrar</button>";
echo "</form>";
} else {
echo "<form method='POST'>";
echo "<input name='logout' type='hidden' value='0'>";
echo "<button type='submit'>Sair</button>";
echo "</form>";
}
Prontinho se tudo faça o teste! Se tudo deu certo você verá uma tela como essa...
Mas se alguma informação estiver incorreta, você será informado com outra mensagem na tela.
Vou deixar aqui a estrutura da tabela users que usamos para fazer a autnticação de usuários:
Deixe um comentário:
Deixe seu comentário. Só serão exibidos comentários ligados ao texto do post. Links serão removidos.