Sistema de login

17 respostas
LucasAdri07

Pessoal, estou fazendo um sistema de login para pode entrar no sistema de cadastro do tcc.

Já fiz a parte de cadastro do usuário e senha no banco de dados, e a ativação por email.

Preciso saber agora, como faço para que o cliente possa logar a partir do cadastro dele.

Segue os códigos de cadastro e ativação.

Cadastro:

<form method="POST">

    Nome:&lt;input type="text" name="nome"&gt;<br>
    Email:&lt;input type="text" name="email"&gt;<br>
    Login:&lt;input type="text" name="login"&gt;<br>
    Senha:&lt;input type="password" name="senha"&gt;<br>
    <br>
    &lt;input type="submit" name="enviar" value="Cadastrar"&gt;
	
&lt;?php


include_once('conecta.php'); 


if( isset( $_POST['enviar'] ) ) {

    $nome = $_POST['nome'];
    $email = $_POST['email'];
    $login = $_POST['login'];
    $senha = md5( $_POST['senha'] );
    $uid = uniqid( rand( ), true );
    $data_ts = time( );
    $ativo = 0;

    $sql = &quot;insert into cadastro ( id_cadastro, nome, email, login, senha,
data_ts, uid,
ativo ) &quot;;
    $sql .= &quot;values
('', '$nome','$email','$login','$senha','$data_ts','$uid','$ativo')&quot;;

    if( ! mysql_query( $sql ) ) {
        echo &quot;Houve um erro inserindo o registro &quot;.mysql_error( );
    } else { // Registro inserido com sucesso, mandar email

        $id = mysql_insert_id( $conexao );

        // Criar as variaveis para validar o email
        $url =
sprintf( 'id=%s&email=%s&uid=%s&key=%s',$id, md5($email), md5($uid),
md5($data_ts)
);

        $mensagem = 'Para confirmar seu cadastro acesse o link:'.&quot;\n&quot;;
        $mensagem .= sprintf('http://www.briefingeventos.com.br/ativaremail.php?%s',$url);

        // enviar o email
        mail( $email, 'Confirmacao de cadastro', $mensagem );

        echo &quot;Registro inserido com sucesso&quot;;
    }
}

?&gt;

&lt;/form&gt;

Ativação:

&lt;?php

include_once('conecta.php');

// Dados vindos pela url
$id = $_GET['id'];
$emailMd5 = $_GET['email'];
$uidMd5 = $_GET['uid'];
$dataMd5 = $_GET['key'];

//Buscar os dados no banco
$sql = &quot;select * from cadastro where id_cadastro = '$id'&quot;;
$sql = mysql_query( $sql );
$rs = mysql_fetch_array( $sql );

// Comparar os dados que pegamos no banco, com os dados vindos pela url
$valido = true;

if( $emailMd5 !== md5( $rs['email'] ) )
    $valido = false;

if( $uidMd5 !== md5( $rs['uid'] ) )
    $valido = false;

if( $dataMd5 !== md5( $rs['data_ts'] ) )
    $valido = false;

// Os dados estão corretos, hora de ativar o cadastro
if( $valido === true ) {
    $sql = &quot;update cadastro set ativo='1' where id_cadastro='$id'&quot;;
    mysql_query( $sql );
    echo &quot;Cadastro ativado com sucesso!&quot;;
} else {
    echo &quot;Informacoes invalidas&quot;;
}

?&gt;

Eu tenho que verificar se o campo ativo está 1 no banco de dados, mas depois disso como faço? Para comparar o usuário e senha dele com o de BD, e como só permitir acessar a página através de login. Alguem tem alguma idéia?

Grato, Lucas

17 Respostas

douglaskd

você vai precisar trabalhar com cookies ou sessions, recomendo sessions é muito facil...

1 -> você vai ter a página de login onde o usuário digita Usuario e Senha. quando clicar em Enviar os dados são enviados para uma página sei la verificaLogin.php

nesta página verifica login, deve haver algo como:

<?php

    $login = $_POST['login'];   
    $senha = $_POST['senha'];   

    $sSql = "SELECT * FROM CADASTRO WHERE LOGIN = '$login' AND SENHA = '$senha'";

    $sql = mysql_query( $sSql );   
    $rs = mysql_fetch_array( $sql ); 

    if(mysql_num_rows($rs) > 0){
         session_start();
         $_SESSION["LOGIN"] = $rs["login"];
         $_SESSION["NOME"] = $rs["nome"];
         $_SESSION["outra coisa que quizer a respeito do usuario"] = whathever;
         header("location:PaginaQuePrecisaEstarLogado.php"); 
         //transfere usuario de pagina
    }
    else{
         header("location:AcessoNegado.php")
          //transfere usuario de pagina
    }

?>

detalhe: cuidado com sql injection, adicione proteção no código acima.

ok, agora essa session fica disponivel para todas as páginas que o usuário for acessar,

o que você precisa fazer agora é verificar se a session esta setada em cada página que necessita estar logado....

algo como:

<?php

//PaginaQuePrecisaEstarLogado.php

if(isset($_SESSION["login"]){

//isso quer dizer que o usuário esta logado, então posso mostrar a página para ele

echo ("bem vindo" $_SESSION["nome"]);
}
else{

//Quer dizer que o usuário acessou a página sem passar pela página de login, então ele nao esta logado

//você define se quer mandar ele direto pra tela de ACESSO NEGADO (que você irá criar)

header("location:AcessoNegado.php");

//ou mandar ele direto para a tela de login:

header("location:Login.php");

}
?>

a página de logof é simples:

<?php

//apagará todos os dados gravados nos $_SESSIONS
session_destroy();

header("location:Login.php");

?>

login é muito simples, não tem erro...

LucasAdri07
douglaskd:
você vai precisar trabalhar com cookies ou sessions, recomendo sessions é muito facil...

1 -> você vai ter a página de login onde o usuário digita Usuario e Senha. quando clicar em Enviar os dados são enviados para uma página sei la verificaLogin.php

nesta página verifica login, deve haver algo como:

<?php

    $login = $_POST['login'];   
    $senha = $_POST['senha'];   

    $sSql = "SELECT * FROM CADASTRO WHERE LOGIN = '$login' AND SENHA = '$senha'";

    $sql = mysql_query( $sSql );   
    $rs = mysql_fetch_array( $sql ); 

    if(mysql_num_rows($rs) > 0){
         session_start();
         $_SESSION["LOGIN"] = $rs["login"];
         $_SESSION["NOME"] = $rs["nome"];
         $_SESSION["outra coisa que quizer a respeito do usuario"] = whathever;
         header("location:PaginaQuePrecisaEstarLogado.php"); 
         //transfere usuario de pagina
    }
    else{
         header("location:AcessoNegado.php")
          //transfere usuario de pagina
    }

?>

detalhe: cuidado com sql injection, adicione proteção no código acima.

ok, agora essa session fica disponivel para todas as páginas que o usuário for acessar,

o que você precisa fazer agora é verificar se a session esta setada em cada página que necessita estar logado....

algo como:

<?php

//PaginaQuePrecisaEstarLogado.php

if(isset($_SESSION["login"]){

//isso quer dizer que o usuário esta logado, então posso mostrar a página para ele

echo ("bem vindo" $_SESSION["nome"]);
}
else{

//Quer dizer que o usuário acessou a página sem passar pela página de login, então ele nao esta logado

//você define se quer mandar ele direto pra tela de ACESSO NEGADO (que você irá criar)

header("location:AcessoNegado.php");

//ou mandar ele direto para a tela de login:

header("location:Login.php");

}
?>

a página de logof é simples:

<?php

//apagará todos os dados gravados nos $_SESSIONS
session_destroy();

header("location:Login.php");

?>

login é muito simples, não tem erro...

Na pagina de verificar login, no meu BD o campo senha está usando MD5 para segurança, como faço para verificar em MD5? só colocar no código
$senha = md5( $_POST['senha'] );
?
pdpbom

Quando o usuario cadastra a senha senha pessoa grava ela com MD5 também
e na linha 4 troca
de

$senha = $_POST['senha'];

para

$senha = md5($_POST['senha']);
LucasAdri07

Quando eu executar isso na página que vai estar liberada para ele acessar:

&lt;?php

//PaginaQuePrecisaEstarLogado.php

if(isset($_SESSION[&quot;login&quot;]){

//isso quer dizer que o usuário esta logado, então posso mostrar a página para ele

echo (&quot;bem vindo&quot; $_SESSION[&quot;nome&quot;]);
}
else{

//Quer dizer que o usuário acessou a página sem passar pela página de login, então ele nao esta logado

//você define se quer mandar ele direto pra tela de ACESSO NEGADO (que você irá criar)

header(&quot;location:AcessoNegado.php&quot;);

//ou mandar ele direto para a tela de login:

header(&quot;location:Login.php&quot;);

}
?&gt;

Ele ja vai mandar automaticamente para a tela de acesso negado se não estiver logado, ou precisa de algo como response.end que tem no ASP ?

douglaskd

isso, ele vai mudar automaticamente…

uma boa idéia é colocar um timer na AcessoNegado.php, 3 segundos acho suficiente (usando Time Interval javascript) e ao acabar o timer ele redireciona para login.php(via javascript tbm)

é semelhante ao Response.Redirect() do Asp.net, pois a transferência é baseada na barra de endereços

LucasAdri07

Já to implementando no sistema. Só tenho uma dúvida.

Por exemplo: O cara vai lá e se cadastra, porém ele não ativa o email, preciso que esse cadastro seja apagado do banco de dados depois de um certo tempo.

Como posso fazer isso? Já tenho um campo na tabela chamado ativo, e assim que o usuário ativa o cadastro pelo email, esse ativo passa de 0 para 1, então eu teria que excluir os cadastros como o ativo valor 0 depois de um certo tempo. Como posso fazer isso?

Grato, Lucas

douglaskd

crie um campo na tabela Cadastro

Date Data_Ultimo_Login

quando o usuário fizer Login você atualiza essa data com a data atual: CURDATE()

Agora na exclusão:

ou você utiliza o Cron e agenda tarefa no servidor, a maioria dos servidores web não aceitam CRON então eu ficaria com a solução acima

agora você decide onde quer colocar essa verificação, se é no login, na tela principal do site, ou em qualquer outra…

LucasAdri07

douglaskd:
crie um campo na tabela Cadastro

Date Data_Ultimo_Login

quando o usuário fizer Login você atualiza essa data com a data atual: CURDATE()

Agora na exclusão:

ou você utiliza o Cron e agenda tarefa no servidor, a maioria dos servidores web não aceitam CRON então eu ficaria com a solução acima

agora você decide onde quer colocar essa verificação, se é no login, na tela principal do site, ou em qualquer outra…

Deixa eu ver se eu entendi.

Se o usuário tiver o campo ativo na tabela com o valor 0, ao executar esse update no BD, ele vai ver nessa tabela Data_Ultimo_Login se fazem mais de 30 dias que o usuário não ativou o email e o campo ativo dele não está com valor 1. Ai depois é só eu fazer o comando de exclusão?

douglaskd

se você quer excluir

então troca por delete

vai excluir todos os usuários que não efetuaram login nos ultimos 30 dias

LucasAdri07

douglaskd:
se você quer excluir

então troca por delete

vai excluir todos os usuários que não efetuaram login nos ultimos 30 dias

Mas nesse caso ele vai deletar os inativos no cadastro, e não os que tem valor 0 no campo ativo, correto?

É que o campo ativo que tem na tabela funciona assim: O cliente fez o cadastro dele. Pra confirmar o cadastro precisa clicar no link que foi enviado por email para ele, seria o link de confirmação. Quando o cliente confirma esse cadastro pelo email, o campo ativo passa a ter valor 1, quer dizer que o usuário validou o seu cadastro, e assim pode logar no sistema. Enquanto o usuário não valida esse cadastro por email, esse campo ativo fica com valor 0. Então eu quero apagar todos os cadastros que estejam com valor 0 no campo “ativo” da tabela depois de um determinado tempo.

douglaskd

LucasAdri07:
douglaskd:
se você quer excluir

então troca por delete

vai excluir todos os usuários que não efetuaram login nos ultimos 30 dias

Mas nesse caso ele vai deletar os inativos no cadastro, e não os que tem valor 0 no campo ativo, correto?

É que o campo ativo que tem na tabela funciona assim: O cliente fez o cadastro dele. Pra confirmar o cadastro precisa clicar no link que foi enviado por email para ele, seria o link de confirmação. Quando o cliente confirma esse cadastro pelo email, o campo ativo passa a ter valor 1, quer dizer que o usuário validou o seu cadastro, e assim pode logar no sistema. Enquanto o usuário não valida esse cadastro por email, esse campo ativo fica com valor 0. Então eu quero apagar todos os cadastros que estejam com valor 0 no campo “ativo” da tabela depois de um determinado tempo.

humm

então você pega pela data de cadastro e verifica o ativo=0:

LucasAdri07

douglaskd:
LucasAdri07:
douglaskd:
se você quer excluir

então troca por delete

vai excluir todos os usuários que não efetuaram login nos ultimos 30 dias

Mas nesse caso ele vai deletar os inativos no cadastro, e não os que tem valor 0 no campo ativo, correto?

É que o campo ativo que tem na tabela funciona assim: O cliente fez o cadastro dele. Pra confirmar o cadastro precisa clicar no link que foi enviado por email para ele, seria o link de confirmação. Quando o cliente confirma esse cadastro pelo email, o campo ativo passa a ter valor 1, quer dizer que o usuário validou o seu cadastro, e assim pode logar no sistema. Enquanto o usuário não valida esse cadastro por email, esse campo ativo fica com valor 0. Então eu quero apagar todos os cadastros que estejam com valor 0 no campo “ativo” da tabela depois de um determinado tempo.

humm

então você pega pela data de cadastro e verifica o ativo=0:

Na hora que ele realiza o cadastro, já tem um campo chamado data_ts na minha tabela que usa a função time(); pra pegar a data do cadastro. Então é só fazer?

douglaskd

isso

faz um teste ai

  • coloca esse código ai em alguma página para ser executado

  • depois insira um usuário diretamente no banco de dados, com a data do mes de fevereiro e ativo =0

em seguida execute a página para ver se o usuario e excluido

luistiagos

seu cadastro está vulnerável a SQL Injection dessa forma.

LucasAdri07

douglaskd:
isso

faz um teste ai

  • coloca esse código ai em alguma página para ser executado

  • depois insira um usuário diretamente no banco de dados, com a data do mes de fevereiro e ativo =0

em seguida execute a página para ver se o usuario e excluido

Beleza, vou testar aqui, muito obrigado por toda essa ajuda, e desculpa pelo incomodo. É que o tcc ta ai, daqui 1 semana e preciso terminar de fazer essa parte de login que é a unica que falta.

douglaskd

Lucas Adri

como o luistiagos disse, não esqueça de bloquear SQL Injection nas consultas

T

[size=18]Esqueceu de uma coisinha o formulario de Cadastro .[/size]
conecta.php
Altere USUARIO para seu usuario no Banco de dados , SENHA para sua senha no banco de dados e NOMEDADB para o nome do seu banco de dados.

<? $conexao = mysql_connect ("localhost","USUARIO","SENHA") OR die (mysql_error()); mysql_select_db ("NOMEDB") OR die (mysql_error()); ?>
formulario.php

<html>
<head>
<title> Formulario</title>
</head>
<body>
<form action="cadastra.php" method="post">
Usuario: <input type="text" name="usuario" /><br>
Senha : <input type="text" name="senha" /><br>
<input type="submit" name="Submit" value="Enviar" />
</form>
</body>
</html>

cadastra.php
Altere o TABELADADB para o nome da tabela de seu banco de dados.

<?
require("conecta.php");

$id = $_POST['id'];
$usuario = $_POST['usuario'];
$senha = $_POST['senha'];



$query = "INSERT INTO TABELADADB (nome, senha ,id) VALUES ('$nome',  '$senha', '$id')"; mysql_query($query) or die ("Ocorreu um erro");
mysql_close();
echo "<script> window.location='index.php';</script>"
?>
Criado 22 de maio de 2012
Ultima resposta 29 de mai. de 2012
Respostas 17
Participantes 5