Jump to content


Photo

Problema - Login.


  • Faça o login para participar
14 replies to this topic

#1 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 04/09/2010, 20:53

Boa noite a todos.

Este é o meu primeiro post aqui no webmasters online. Peço desculpas antecipadamente, caso esteja criando esta postagem na sessão inadequada do fórum.

Bom, sou iniciante em PHP. Tenho estudado a linguagem há, aproximadamente, dois meses e estou criando um sistema para gerenciamento de conteúdo. Estou com um problema na realização do login.

A página html com o formulário é básica, por isso vou postar logo a página de validação (validacao.php). Segue:


<?php
function __autoload($classe) {
$db = parse_ini_file("./diretorio.ini");
$pos = strrpos($dir = getcwd(), $db['pasta']);
$dir = substr($dir, 0, $pos).$db['pasta'];

$arr = array('utilitarios', 'persistencia');
foreach($arr as $key => $folder) {
if(file_exists($dir."/{$folder}/{$classe}.php")) {
include_once $dir."/{$folder}/{$classe}.php";
}
}
}

#Validacao dos preenchimentos dos campos.
if (($_POST)) {
#Se as os campos forem todos preenchidos (diferentes de vazio) e alguma opcao for selecionada executa a operacao.
if (empty($_POST['login']) OR empty($_POST['senha']) OR ($_POST['opcao'] == 'Selecione')) {
echo '[Validacao Preenchimento Campos]Login Inv&aacute;lido!<br />';
echo '<a href="area_restrita.php">Clique aqui para retornar &agrave; p&aacute;gina inicial</a>';
exit;
}
}


#Validacao dos caracteres de login e senha.
$vc = new TValidaCampos;
if($vc -> validaUsername($_POST['login']) AND $vc -> validaSenha($_POST['senha'])) {
$usuario = $_POST['login'];
$senha = $_POST['senha'];
$opcao = $_POST['opcao'];
} else {
echo '[Validacao Login e Senha]Login Inv&aacute;lido.<br />';
echo '<a href="area_restrita.php">Clique aqui para retornar &agrave; p&aacute;gina inicial</a>';
exit;
}

#Autenticacao do login
$tl = new TLogin;

$status = $tl -> avaliaDados($usuario, $senha, $opcao);

if($status == 0) {
echo "Login Invalido";
}

if($status == 1) {
echo "<meta http-equiv = 'refresh' content = '0'; url = 'ar_home.php'>";
}
?>


Quando eu envio os dados através do formulário, a validação do preenchimento dos campos é feita corretamente.

Logo abaixo, eu tenho que efetuar a validacao do login e senha (através de expressão regular na classe TValidaCampos), para depois autenticar o login, avaliando junto ao banco se o usuário existe (através da classe TLogin).

O problema que está ocorrendo é o seguinte:

Quando a aplicação está em execução, as variáveis recebidas por post chegam vazias ao método de validação dos caracteres de login e senha. Dessa forma, logicamente a validação sempre dá errado e ação de login é abortada.

O mais estranho é que quando retiro o último if da autenticação do login (para efeito de testes), as variáveis não sofrem alteração no valor e o processo é concluído com sucesso.

Não consigo entender o que está acontecendo. Alguém pode me ajudar?

Desde já, obrigado.

Nota: Modifiquei a função autoload() pq não consegui alterar o include_path nos arquivos de configuracao do php de jeito nenhum. Assim, fiz a alteração para pegar sempre o caminho absoluto do diretório onde os arquivos estiverem armazenados.

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 04/09/2010, 21:09

Mostra como é o método de validação.

#3 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 04/09/2010, 21:35

LeoB, segue o método de validação:


<?php

class TValidaCampos {

public function validaUsername($value) {
#Os usernames podem conter apenas letras minusculas, numeros, ponto e/ou underline.
#Devem conter no minimo 05 caracteres.
if(ereg("^[a-z0-9\.\_]{5,}$", $value)) {
return true;
} else {
return false;
}
}

public function validaSenha($value) {
#As senhas podem conter apenas letras minusculas e/ou numeros.
#Devem conter no minimo 05 caracteres.
if(ereg("^[a-z0-9]{5,}$", $value)) {
return true;
} else {
return false;
}
}
}
?>


Método para autenticação do login (Conferência dos dados no banco):


<?php

class TLogin {
var $num; #Retorna o total de linhas encontradas para uma consulta
var $status; #Retorna a autenticidade do login efetuado
var $table; #Armazena, temporariamente, a tabela adequada ao contexto de login (Profissionais, Empresas ou Talentos)

public function avaliaDados($usuario, $senha, $opcao) {

try {
TTransaction::open('my_livro');

$criteria = new TCriteria;
$criteria -> add(new TFilter('username', '=', $usuario));
$criteria -> add(new TFilter('senha', '=', $senha));

$sql = new TSqlSelect;

#Estabelece a entidade adequada a opcao.
if($opcao == 'Instrutor') {
$sql -> setEntity('db_talentos.profissionais');
$this -> table = 'profissionais';
}

if($opcao == 'Empresa Parceira') {
$sql -> setEntity('db_talentos.empresas');
$this -> table = 'empresas';
}

if($opcao == 'Talentos') {
$sql -> setEntity('db_talentos.talentos');
$this -> table = 'talentos';
}

$sql -> addColumn('count(*)');
$sql -> setCriteria($criteria);

#Executa a instrucao
$conn = TTransaction::get();

$result = $conn -> query($sql -> getInstruction());

foreach($result as $row) {
$this -> num = $row['count(*)'];
}

#Se o numero de linhas da consulta corresponder a 1, avalia efetivamente os dados fornecidos
if($this -> num == 1) {

$criteria02 = new TCriteria;
$criteria02 -> add(new TFilter('username', '=', $usuario));
$criteria02 -> add(new TFilter('senha', '=', $senha));

#Estrutura a instrucao
$sql02 = new TSqlSelect;
$sql02 -> setEntity('db_talentos.' . $this -> table);
$sql02 -> addColumn('username');
$sql02 -> addColumn('senha');
$sql02 -> setCriteria($criteria);

#Executa a instrucao
$conn02 = TTransaction::get();
$result02 = $conn02 -> query($sql02 -> getInstruction());

foreach($result02 as $row02) {
$user = $row02['username'];
$pass = $row02['senha'];
}

#Avalia a autenticidade do usuario
if(($user == $usuario) AND ($pass == $senha)) {
$this -> status = 1;
} else {
$this -> status = 0;
}
} else {
#Sinaliza a inadequacao dos dados
$this -> status = 0;
}
#Encerra a transacao
TTransaction::close();
} catch (Exception $e) {
echo $e -> getMessage();
TTransaction::rollback();
}
#Retorna o total de linhas identificadas
return $this -> status;
}
}
?>


#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 04/09/2010, 22:34

Explica o problema de novo, por favor. Com outras palavras.

#5 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 04/09/2010, 22:55

LeoB,

Vou tentar divir em tópicos, porque realmente é uma situação confusa...

  • Eu submeto os dados no formulário;
  • Na primeira verificação, eu avalio se todos os campos foram preenchidos (Essa funciona corretamente);
  • Na segunda verificação, eu avalio se os caracteres do login e senha informados pelo usuário são aceitáveis (Essa não funciona corretamente. Se eu imprimir as variáveis dentro dos métodos de verificação, não haverá nenhum valor, elas ficam vazias);
  • Logo abaixo da linha "#Autenticação do login." do meu primeiro post, eu deveria fazer a conferência dos dados fornecidos com as informações armazenadas no banco, mas devido ao erro no método anterior (verificação de caracteres), esse procedimento nem chega a ser efetuado.

Como eu citei inicialmente, quando eu retiro o último if do código da página de validacao:


if($status == 1) {
echo "<meta http-equiv = 'refresh' content = '0'; url = 'ar_home.php'>";
}


Estranhamente tudo funciona normal. Não sei se tem algo a ver com a modificação que fiz no auto load, mas acho que não... Eu testei ele pra caramba antes de começar a usar...


Obrigado pela paciência.

Até logo.

#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 05/09/2010, 00:34

Como você faz pra saber se o usuário está logado ou não quando ele navega no sistema?

#7 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 05/09/2010, 01:13

Na verdade, eu dependo destes métodos para terminar a rotina de login e começar a manipular as informações do usuário.

O problema está impedindo que eu autentique corretamente o login e senha do usuário e, dessa forma, redirecione ele para outras regiões da área restrita. Corrigindo o erro, terei possibilidade de saber se o usuário está logado ou não e assim por diante, conforme a sua pergunta.


Obrigado.

#8 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 05/09/2010, 11:08

Estou perguntando essas coisas porque não faz sentido a variável estar vazia dentro do método. O erro deve estar em algum outro lugar. Mostra aí como você fez pra debugar e chegar à conclusão de que era esse o problema.

#9 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 06/09/2010, 13:15

Para chegar a conclusão de que este era o problema, eu imprimi as variáveis recebidas por parâmetro dentro dos métodos validaUsername($value) e validaSenha($value)

A partir disso conclui que elas estavam ficando vazias.

Não consigo entender de jeito nenhum pq isso está ocorrendo... Elas são enviadas normalmente e depois tornam-se vazias...


Obrigado.

#10 André Manoel

André Manoel

    Doutor

  • Usuários
  • 996 posts
  • Sexo:Masculino
  • Localidade:Brasilia

Posted 06/09/2010, 14:18

class TValidaCampos {

    public function validaUsername($value) {
        var_dump($value);
        #Os usernames podem conter apenas letras minusculas, numeros, ponto e/ou underline.
        #Devem conter no minimo 05 caracteres.
        if(ereg("^[a-z0-9\.\_]{5,}$", $value)) {
            return true;
        } else {
            return false;
        }
    }

    public function validaSenha($value) {
        var_dump($value);
        #As senhas podem conter apenas letras minusculas e/ou numeros.
        #Devem conter no minimo 05 caracteres.
        if(ereg("^[a-z0-9]{5,}$", $value)) {
            return true;
        } else {
            return false;
        }
    }
}

Você fez assim para ver os valores das variáveis?
Iniciando na Ajuda On line...

Posted Image Meu post lhe ajudou? Reputar/votar é uma das formas de agradecer.

#11 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 06/09/2010, 16:25

André,

Basicamente isso, porém usei echo no lugar do var_dump().


Até logo.
Obrigado.

#12 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 06/09/2010, 17:09

Os motivos pra $_POST estar vazio são a página ser acessada por GET ou realmente nada ter sido postado. Mas se esse fosse o caso, a primeira validação tinha falhado, como você disse. No lugar de imprimir a tag <meta>, imprima só "Login bem sucedido" ou coisa assim e veja se funciona como deveria.

#13 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 06/09/2010, 20:57

LeoB,

Fiz a alteração sugerida e funcionou corretamente! Muito obrigado a vc e ao André pelo auxílio!

Mas, pq este erro estava ocorrendo? Qual o impacto da tag meta neste caso?


Boa noite!

Edição feita por: cjdj, 06/09/2010, 21:03.


#14 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 06/09/2010, 22:06

Como ficou o código agora?

#15 cjdj

cjdj

    Novato no fórum

  • Usuários
  • 14 posts
  • Sexo:Masculino
  • Localidade:Uberlândia (MG)

Posted 06/09/2010, 22:55

Temporariamente, substituí a tag meta por:

echo "<script>document.location='ar_home.php'</script>";

Depois, irei adaptar o código para utilizar header location. Ainda não posso utilizar pq estou imprimindo código html antes deste trecho...


Até mais.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq