Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ThinkBrunus

[Resolvido] Opinião login

Recommended Posts

Olá!

Mais uma vez venho em busca de uma opinião sobre como fazer um sistema de login.

 

O que pretendo é que o user faça o login no form normal e os dados sejam validados na mesma página, e se a autenticação for validada, queria que desaparecesse o tal formulário e aparecesse os dados do user, por exemplo.

 

Entretanto já fiz umas pesquisas e algum estudo para desenvolver algo em AJAX e PHP, ou só em PHP. De momento estou a tentar implementar AJAX com PHP mas já tenho a cabeça quase em àgua....

 

Gostava de saber opiniões.

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quiser dar uma olhada no guia que coloquei no meu blog:

http://thiagobelem.net/blog/php/2009/03/09...hp-e-mysql-319/

 

Aqui no fórum é só usar a busca e você vai achar MUITA coisa sobre o assunto tb.

 

http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vi o teu guia e achei muito bom mesmo!

Acabei por seguir alguns passos que indicas no teu blog.

 

Optei por fazer o sistema de login utilizando AJAX e PHP, só não estou a conseguir fazer uma coisa, ou seja, ao inserir os dados para autenticar escrevo em php o form com uma cláusula if

<div id="iBlockUser">
	<?php 
		if (!isset($_SESSION['nome'])) {
			unset($_SESSION['nome']);
			echo"<script language='javascript' src='scripts/ajax.js'></script>
			<table><form id='frmLogin' name='frmLogin' method='post' > 
			<tr>
				<td>Username:</td>
				<td><input type='text' name='txtUserName' id='txtUserName' size='14' maxlength='14' /></td>				
			</tr>
			<tr>
				<td>Password:</td>
				<td><input type='text' name='txtPassword' id='txtPassword' size='14' maxlength='14' /></td>				
			</tr>
			<tr>
				<td colspan='2' align='right'><input name='btnLogin' value='Login' id='btnLogin' type='submit' onclick='java script:login();' /></td>
			</tr>					
			</form>
		</table>";					
		}else{
			include('seguranca.php'); 		
		}	
		   </div>
	?>

aqui é chamado o ficheiro AJAX, busca os dados e envia-os para a página onde faz a validação dos dados

 

function login(){
xmlHttp = getXmlHttpObject(); //inicializa variável com identificação do browser
var username = encodeURI(document.getElementById('txtUserName').value);
var password = encodeURI(document.getElementById('txtPassword').value);
nocache = Math.random();
xmlHttp.open("GET", "login.php?username="+username+"&password="+password+"&nocache="+nocache);
	xmlHttp.onreadystatechange = function(){
		if (xmlHttp.readyState == 4) {
			alert(xmlHttp.responseText);
			//document.getElementById("iMenuV").innerHTML = xmlHttp.responseText;
		}
	}
xmlHttp.send(null);
}

Agora valida dados enviados e retorna valor para AJAX, e se validar correctamente cria a session com o username...

 

<?php
include('includes/config.php');

//CÓDIGO LOGIN AJAX&PHP
$username = $_GET['username'];
$password = $_GET['password'];
$sql = "SELECT * FROM ndetalhe WHERE nome='" . $username . "' AND password='" . $password . "'";
$query = mysql_query($sql) or die('Query failed: ' . mysql_error());
$result = mysql_num_rows($query);
	if ($result > 0){
		echo "Confere!";
		session_start();
		$_SESSION['nome'] = $username;
	}else{
		echo "Dados incorrectos!";
	}
?>

Por fim, e aqui o meu problema:

......
		}else{
			include('seguranca.php'); 		
		}	
	?>

O que pretendo é que quando o user for validado, desapareça o formulário e seja apresentado o nome do user, por exemplo. Este include refere-se a essa mensagem

 

<?php
	echo "Olá, " . $_SESSION['nome'];
?>

Que não está a funcionar....o formulário mantem-se e a mensagem não aparece....

coloquei on-line em : http://teste.vibeltaxis.com/index.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nessa parte do script:

 

if ($result > 0){
		echo "Confere!";
		session_start();
		$_SESSION['nome'] = $username;
Logo após a definição do $_SESSION['nome'] você redireciona a página usando o header("Location: pagina.php");...

 

Qualquer dúvida é só falar! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tá usando javascript pra fazer esse login... O caminho é completamente diferente... :P

 

O exemplo que eu dei seria um login em PHP... Não via javascript com Ajax.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado na mesma!

 

Optei implementar a autenticação login com AJAX+PHP porque pelo que pesquisei e li, diz-se que desta forma é mais seguro.

Também tinha o problema de ocultar uma layer se o login fosse autenticado...e com ajax ainda não está a fazer isso a 100% mas para lá caminha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com certeza que sim!

Este login utiliza três ficheiros: index.php, ajax.js e login.php

 

O meu objectivo é o user inserir o username e password, são submetidos os dados e processados no ajax.js que por sua ver faz o reques à página login.php que valida o login na base de dados. Pretendo também que a autenticação seja feita apenas na página index.php, e é nesta parte que ainda estou com problema!

Então aqui vai!

 

index.php

<?php
	include('includes/settings.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml2/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Portal</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="scripts/ajax.js"></script>
</head>
<body>
<div id="iContainer">
	<div id="iBanner"></div>
	<div><!-- MENU HORIZONTAL-->
		<ul id='menu'>
			<li><a href='index.php'>Início</a></li>
			<li><a href='#'>Menu1</a></li>
			<li><a href='#'>Menu2</a></li>
			<li><a href='#'>Menu3</a></li>
			<li><a href='#'>Menu4</a></li>
			<li><a href='#'>Menu5</a></li>
			<li><a href='helpdesk/index.php'>Helpdesk</a></li>
		</ul>	
	</div>
	<div id="iBreadcrumb_Search">
		<div id="iBreadcrumb"></div>
		<div id="iSearch">Pesquisar: <input type="text" name="txtPesquisa" id="txtPesquisa" size="25" maxlength="30" />
			<input id="btnPesquisar" name="btnPesquisar" value=" Go! " type="button" />
		</div>
	</div>
	<div id="iNavigator">	
	<!-- FORMULÁRIO AJAX&PHP -->
	<div id="iBlockUser">
		<div id="iBlockUserLogin">	   
			<table><form id="frmLogin" name="frmLogin" method="post" action="java script:login()">		
			<tr>
				<td>Username:</td>
				<td><input type="text" name="txtUserName" id="txtUserName" size="14" maxlength="14" /></td>				
			</tr>
			<tr>
				<td>Password:</td>
				<td><input type="text" name="txtPassword" id="txtPassword" size="14" maxlength="14" /></td>				
			</tr>
			<tr>
				<td colspan="2" align="right"><input name="btnLogin" value="Login" id="btnLogin" type="submit" /></td>   
			</tr>					
			</form></table>	 
		</div>
<!-- AQUI FICA O PROBLEMA QUE FALEI, AO VALIDAR O USER PRETENDO QUE DESAPAREÇA O FORM E SEJA APRESENTADA A MSG DE BOAS VIDAS AO USER COM O VALOR DA VARIAVEL $_SESSION['nomedoutilizador']-->
		<div id="iBlockUserLogout"><?php
			if (isset($_SESSION['test'])){
				session_start();
				echo "Olá, " . $_SESSION['test'];
			}
		?>			
		</div>
	</div>
	<div id="iMenuV">Menu<br />Menu<br />Menu</div>
	</div>
	<div id="iContents"><br />textotextotextotextotextotexto<br />textotextotextotexto<br />textotextotexto<br />textotextotextotexto<br />textotextotextotexto
	</div>
	<div id="iFooter"> </div>
</div>
</body>
</html>

ajax.js

 

var xmlHttp;
var nocache = 0;

function login(){
xmlHttp = getXmlHttpObject(); //inicializa variável com identificação do browser
var username = encodeURI(document.getElementById('txtUserName').value);
var password = encodeURI(document.getElementById('txtPassword').value);
nocache = Math.random();
xmlHttp.open("GET", "login.php?username="+username+"&password="+password+"&nocache="+nocache);
	xmlHttp.onreadystatechange = function(){
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.responseText == 1){
//AQUI ANDO EM TESTES A TENTAR ESCONDER UMA LAYER E APRESENTAR OUTRA, A TAL COM A MSG AO USER...NÃO ESTOU A  
//CONSEGUIR ARRANJAR FORMA DE FAZER ISTO...
				document.getElementById("iBlockUserLogin").style.display="none";
				document.getElementById("iBlockUserLogout").innerHTML = "session_start(); $_SESSION['test'] = $username;";
//				alert("Confere!");
			}else{
				alert("Dados incorrectos!");				
			}
		}
	}
xmlHttp.send(null);
}

[b]login.php[/b]

include('includes/settings.php');

$username = $_GET['username'];
$password = $_GET['password'];
$sql = "SELECT * FROM ndetalhe WHERE nome='" . $username . "' AND password='" . $password . "'";
$query = mysql_query($sql) or die('Query failed: ' . mysql_error());
$result = mysql_num_rows($query);
	if ($result > 0){
		echo "1";
	}else{
		echo "0";
	}
?>

E é isto! Está a autenticar, acho que para ficar como deve ser faltam as sessões...que é nisso que estou a trabalhar. Se alguém tiver alguma ideia de como inicializar a sessão tendo em conta o código, poderemos aperfeiçoar este sistema de login!

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... ai é que temos um problema (eu acho), pois a $_SESSION só vai estar disponível numa próxima requisição.... Não sei se com o AJAX vai dar pra pegar a seção, pois não a um refresh na página!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas suponho que para retirar o formulário e exibir outra coisa dentro da DIV que o contém após a verifição do login é necessário usar innertHtml... do javascript! Ai você colocaria o ID da DIV que receberia os novos dados! Procura por InnerHtml... Eu não conheço muito de javascript!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, é isso! Já testei isso neste código, é só alterar a linha para:

 

document.getElementById("iBlockUserLogout").innerHTML = "<div id='iBlockUserLogin>Olá $_SESSION['username']</div>'";

Isto é o que pretendo fazer, mas como no meio deste código estou a ter dificuldade em inicializar a sessão....a linha acima não funciona correctamente.

Alguma sugestão para uma forma de inicializar a sessão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara eu fiz aqui e deu certo:

- No script de validadeção coloca algo assim:

 

<?
// Se encontrar alguem com o login e senha passados
if ( mysql_num_rows ( $query ) )
{
	$user = mysql_fetch_object ( $query );
	$_SESSION['USER_ID'] = $user -> id;
	$_SESSION['USER_NAME'] = $user -> nome;
}
?>

Aqui eu consegui recuperar essas $_SESSION dentro da DIV no index.php...

Ou seja, iniciei as sessões no mesmo script que valida o login!

Agora eu estou tentando descobrir uma maneira de gravar dados no banco via o AJAX...

 

Quero que quando um usuário efetue o login grave a data e hora... para fazer algo com uma auditoria no sistema!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa!

Vou implementar essa parte no meu código, já te digo alguma coisa!

 

Então olha, não dá para gravares na session a hora actual? Vou tentar implementar esta parte, depois vou tentar essa parte de gravar no banco de dados...até já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da pra gravar a hora sim na sessao sim...

Mas como por exemplo eu saberia que horas eu me loguei no sistema em 25/12/1998 por exemplo?

Entendeu, por isso no meu caso eu preciso gravar no banco!

Vê ai se deu certo.

 

Ah! E veja se está tudo normal no FireFox! Porque pra mim não deu certo o innerHTML!

Ele tira meu formulário e exibe apenas o xmlhttp.responseText!

 

No IE acontece um problema, mesmo que esteja errado o login e senha aparece rápidamente o xmlhttp.responseText, mas daí esta dando um refresh após isso!

Bom, vou continuar os testes macabros aqui!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alô pessoal!

No seguimento do tema, depois de ter validado o user e inicializado a sessão, surge só um problema, se entrar numa secção do site que contenha uma pasta o ficheiro em ajax.js já não vai buscar o caminho, para funcionar correctamente tenho criei outro ficheiro e alterei a seguinte linha

xmlHttp.open("GET", "../login.php?username="+username+"&password="+password+"&nocache="+nocache);

Se alguém tiver alguma sugestão para contornar a situação, será bemvinda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então deu certo as SESSION?

Bom, você pode fazer a função login() carregar qualquer página que você quiser, exemplo:

 

function login( url )
{
xmlHttp = getXmlHttpObject(); //inicializa variável com identificação do browser

// Não vamos mais precisar...
//var username = encodeURI(document.getElementById('txtUserName').value);
//var password = encodeURI(document.getElementById('txtPassword').value);

nocache = Math.random();

// Aqui está a mudança.
xmlHttp.open( "GET", url + '&nocache='+nocache );

	xmlHttp.onreadystatechange = function()
												 {
													   if (xmlHttp.readyState == 4) 
													   {
															  document.getElementById("iMenuV").innerHTML = xmlHttp.responseText;
													   }
												 }
xmlHttp.send(null);
}

Entendeu? A mudança feita permite que você possa usar essa função para request de qualquer script, não só para login.

Então você pode mudar o nome da função.

 

Você poderá usar a função assim:

// Seta as variáveis necessárias para verificação do login
var username = encodeURI(document.getElementById('txtUserName').value);
var password  = encodeURI(document.getElementById('txtPassword').value);

// Então chama a função.
novo_nome_funcao ( "login.php?username="+username+"&password="+password );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá! Sim deu certo sim, tá a funcionar! Como dizias é necessário fazer um refresh, ele dá um warning...mas ainda não mexi nessa parte.

 

Quanto a esta parte de fazer a função, não estou a perceber como é que ele vai buscar automaticamente o url (é que eu tenho na raiz do site algumas pastas, que podemos identificar como várias funcionalidades, por ex: noticias, agenda...)

Quando faço link que vai para o index das noticias (/noticias) , ele deixa de ir buscar o ficheiro login.php...acho q é necessário na mesma andar uma pasta para cima...ou não?

Poderei estar a ver mal a ideia...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.