Sistema de login

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:

[code]<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;

<?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 ) ";
$sql .= “values
(’’, ‘$nome’,’$email’,’$login’,’$senha’,’$data_ts’,’$uid’,’$ativo’)”;

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;;
}

}

?>

</form>[/code]

Ativação:

[code]<?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 = “select * from cadastro where id_cadastro = ‘$id’”;
$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 = “update cadastro set ativo=‘1’ where id_cadastro=’$id’”;
mysql_query( $sql );
echo “Cadastro ativado com sucesso!”;
} else {
echo “Informacoes invalidas”;
}

?>[/code]

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

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:

[code]<?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
}

?>[/code]

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:

[code]<?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”);

}
?>
[/code]

a página de logof é simples:

[code]<?php

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

header(“location:Login.php”);

?>[/code]

login é muito simples, não tem erro…

[quote=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:

[code]<?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
}

?>[/code]

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:

[code]<?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”);

}
?>
[/code]

a página de logof é simples:

[code]<?php

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

header(“location:Login.php”);

?>[/code]

login é muito simples, não tem erro…[/quote]

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'] ); ?

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']);

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

[code]<?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");

}
?>[/code]

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 ?

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

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

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…

[quote=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…

[/quote]

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?

se você quer excluir

então troca por delete

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

[quote=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[/quote]

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.

[quote=LucasAdri07][quote=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[/quote]

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.[/quote]

humm

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

[quote=douglaskd][quote=LucasAdri07][quote=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[/quote]

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.[/quote]

humm

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

[/quote]

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?

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

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

[quote=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

[/quote]

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.

Lucas Adri

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

[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>"
?>