Ir para conteúdo

POWERED BY:

Arquivado

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

miqueiasrafael

Correção de multiplo acesso

Recommended Posts

Olá galera, estou tentando criar uma área de acesso para múltiplos usuários, segue a baixo o código:

Minha dúvida é a seguinte, quando o usuário ou o administrador do sistema for logar no sistema, passará por uma validação que está incluida em outras páginas enlaçada no script abaixo.

 

A pergunta é:

 

Quando o usuário ou administrador tentar logar e o login e senha forem verdadeiros "TRUE" terá o acesso se não "FALSE" o sistema expulsa o visitante ou usuário ou administrador.

 

 

<?php

include '_seguranca.php';
include '_segurancaController.php';



// Verifica o POST do form
if ($_SERVER['REQUEST_METHOD'] == 'POST') {

// isset() verif. se o campo foi preenchido
   $usuario = (isset($_POST['_user'])) ? $_POST['_user'] : '';
   $senha = (isset($_POST['_pass'])) ? $_POST['_pass'] : '';
 
   $admin = $usuario;
   $pass = $senha;

// Recebe função de validação do seguranca.php
   if (validaUsuario($usuario, $senha) == true) {
      header("Location:main.php");
   }


   if (validaAdministrator($admin, $pass) == true) { // Pega função Administrator
      header("Location:admin/all-controller.php");
   } else {

      expulsaVisitante();    // config. login-user -> seguranca.php

      expulsaVisitaController();
   }
}
?>



 

 

Desde já obrigado

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não minha opinião não precisaria de duas funções para se fazer isso.

 

Basta ter um campo no db e setar o nível de usuário. (admin, user ou 0, 1, 2)

 

e ao efetuar o login guardar no o nível do usuário em um cookie ou session

 

e manipular com ifs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Williams Duarte, tens um exemplo?

 

Pois tá funcionando, pelo menos tô conseguindo acessar como administrador, mas não como usuário!

 

 

 

Não minha opinião não precisaria de duas funções para se fazer isso.

 

Basta ter um campo no db e setar o nível de usuário. (admin, user ou 0, 1, 2)

 

e ao efetuar o login guardar no o nível do usuário em um cookie ou session

 

e manipular com ifs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui tem uma boa lógica http://blog.thiagobelem.net/como-criar-um-sistema-de-login-com-niveis-de-permissao/

 

O meu código você não ira entender, veja um trecho:

 

...

$stmt = $this->conn->prepare( $this->sql );

				if( $stmt ) {

					$stmt->bindValue(1, $usuarioVO->getUsuEmail(), PDO::PARAM_STR);
					$stmt->execute();

					if ( $stmt->rowCount() > 0 ) {

						$obj = $stmt->fetch ( PDO::FETCH_OBJ );

						// hash de senha salva no banco de dados
						$storedPassword = $obj->usu_senha;
						$postedPassword = $usuarioVO->getUsuSenha();
						$saltedPostedPassword = SECURITY_SALT . $postedPassword;
						// instanciar PasswordHash para verificar se é uma senha válida
						$hasher = new PasswordHash(8,false);
						$check = $hasher->CheckPassword($saltedPostedPassword, $storedPassword);

						if( $check !== false ) {

							if($obj->usu_status > 0) {

								$usuarioVO->setUsuId( $obj->usu_id );
								$usuarioVO->setUsuName( $obj->usu_name );
								$usuarioVO->setUsuEmail( $usuarioVO->getUsuEmail() );
								$usuarioVO->setUsuRole( $obj->usu_role );
								$usuarioVO->setToken( time() );
								$usuarioVO->setUsuSessionId( session_id() );
								$usuarioVO->setStatus(1);

							} else {
								$usuarioVO->setStatus('-1');
							}

						} else {

							$usuarioVO->setStatus(0);
						}

					} else {
						$usuarioVO->setStatus(0);
					}

					$stmt->closeCursor();
				}

			} catch (PDOException $e) {
	           exit('Erro: ' . $e->getMessage() );
	        }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Williams Duarte, Não estou utilizand framework para o caso que estou fazendo apenas php puro, mesmo assim obrigado!

 

 

Aqui tem uma boa lógica http://blog.thiagobelem.net/como-criar-um-sistema-de-login-com-niveis-de-permissao/

 

O meu código você não ira entender, veja um trecho:

 

...

$stmt = $this->conn->prepare( $this->sql );

				if( $stmt ) {

					$stmt->bindValue(1, $usuarioVO->getUsuEmail(), PDO::PARAM_STR);
					$stmt->execute();

					if ( $stmt->rowCount() > 0 ) {

						$obj = $stmt->fetch ( PDO::FETCH_OBJ );

						// hash de senha salva no banco de dados
						$storedPassword = $obj->usu_senha;
						$postedPassword = $usuarioVO->getUsuSenha();
						$saltedPostedPassword = SECURITY_SALT . $postedPassword;
						// instanciar PasswordHash para verificar se é uma senha válida
						$hasher = new PasswordHash(8,false);
						$check = $hasher->CheckPassword($saltedPostedPassword, $storedPassword);

						if( $check !== false ) {

							if($obj->usu_status > 0) {

								$usuarioVO->setUsuId( $obj->usu_id );
								$usuarioVO->setUsuName( $obj->usu_name );
								$usuarioVO->setUsuEmail( $usuarioVO->getUsuEmail() );
								$usuarioVO->setUsuRole( $obj->usu_role );
								$usuarioVO->setToken( time() );
								$usuarioVO->setUsuSessionId( session_id() );
								$usuarioVO->setStatus(1);

							} else {
								$usuarioVO->setStatus('-1');
							}

						} else {

							$usuarioVO->setStatus(0);
						}

					} else {
						$usuarioVO->setStatus(0);
					}

					$stmt->closeCursor();
				}

			} catch (PDOException $e) {
	           exit('Erro: ' . $e->getMessage() );
	        }

Compartilhar este post


Link para o post
Compartilhar em outros sites

muito bom o modelo de projeto

 

 

Mas em nenhum momento postei, alguma coisa relacionado a frameworks. :no:

 

DAO => Data Access Object

 

Até agora o código tá assim galera, a situação é a seguinte quero a través do filtro buscar os usuários do tipo operador(1) ou administradores(2) e mostrar as paginas correspondentes como mostra abaixo no código:

 

 

 

Mais ainda não está funcionando, na questão do redirecionamento em relação ao filtro por níveis, mudei a lógica antiga mas enxugar o código e deixa-lo mais interessante quanto a organização!

Desde já obrigado pelas dicas!

 

<?php include 'config.php';// Verifica se houve POST é vazioif (!empty($_POST) AND (empty($_POST['_user']) OR empty($_POST['_pass']))) {   header("Location: index.php");   exit;}$usuario = mysql_real_escape_string($_POST['_user']);$senha = mysql_real_escape_string($_POST['_pass']);$sql = "SELECT id, nome, nivel FROM from_cad_user WHERE (login = '" . $usuario . "') AND (senha = '" . sha1($senha) . "') AND (ativo = 1) LIMIT 1";$query = mysql_query($sql);$nivel = mysql_num_rows($query);if (mysql_num_rows($query) != 1) {   header("Location: ../index.php");   echo '<script> alert("Login ou Senha inválidos!");</script>';   exit;} else if ($nivel == 1) {   // Salva os dados na variável $op   $op = mysql_fetch_assoc($query);   // Se a sessão não existir, inicia uma   if (!isset($_SESSION))      session_start();   // Salva os dados encontrados na sessão   $_SESSION['UsuarioID'] = $op['id'];   $_SESSION['UsuarioNome'] = $op['nome'];   $_SESSION['UsuarioNivel'] = $op['nivel'];   // Redireciona o visitante   header("Location: pg-operation.php");} else if ($nivel == 2) {   // Salva os dados na variável $ad   $ad = mysql_fetch_assoc($query);   // Se a sessão não existir   if (!isset($_SESSION))      session_start();   // Salva os dados na sessão   $_SESSION['UsuarioID'] = $ad['id'];   $_SESSION['UsuarioNome'] = $ad['nome'];   $_SESSION['UsuarioNivel'] = $ad['nivel'];   // Redireciona o visitante   header("Location: admin/area-do-administrador.php");   exit;}?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro não seria nessa linha aqui ?

 

$nivel = mysql_num_rows($query);

// Num_rows retorna a quantidade de Registros encontrados.
//Como o seu SELECT está com um LIMIT 1, o resultado sempre será de 1 registro.
//Entao o nivel está sempre recebendo 1.
//Modifique pra isso:

$dados = mysql_fetch_assoc($query);
$nivel = $dados['nivel'];


Compartilhar este post


Link para o post
Compartilhar em outros sites

Até agora o código está assim Bruno7, já tinha feito daquela maneira que vc mencionou acima, aproveite e fiz umas modificações e mesmo assim não funcionou segue abaixo o código!

Com essa modificação não consegui ter acesso ao main.php se (1) e a area-do-administrador.php

se (2)

 

Desde já obrigado a todos!

 

<?php include 'config.php'; // Verifica se houve POST é vazio if (!empty($_POST) AND (empty($_POST['_user']) OR empty($_POST['_pass']))) {    header("Location: index.php");    exit; } $usuario = mysql_real_escape_string($_POST['_user']); $senha = mysql_real_escape_string($_POST['_pass']); $sql = "SELECT id, nome, nivel FROM from_cad_user WHERE (login = '" . $usuario . "') AND (senha = '" . sha1($senha) . "') AND (ativo = 1) LIMIT 1"; $query = mysql_query($sql); $nivel = mysql_num_rows($query); if (mysql_num_rows($query) != 1) {    header("Location: ../index.php");    echo '<script> alert("Login ou Senha inválidos!");</script>';    exit; } else if ($nivel == 1) {    // Salva os dados na variável $op   $op = mysql_fetch_assoc($query);    // Se a sessão não existir, inicia uma    if (!isset($_SESSION))       session_start();    // Salva os dados encontrados na sessão    $_SESSION['UsuarioID'] = $op['id'];    $_SESSION['UsuarioNome'] = $op['nome'];    $_SESSION['UsuarioNivel'] = $op['nivel'];    // Redireciona o visitante    header("Location: pg-operation.php"); } else if ($nivel == 2) {    // Salva os dados na variável $ad    $ad = mysql_fetch_assoc($query);    // Se a sessão não existir    if (!isset($_SESSION))       session_start();    // Salva os dados na sessão   $_SESSION['UsuarioID'] = $ad['id'];    $_SESSION['UsuarioNome'] = $ad['nome'];    $_SESSION['UsuarioNivel'] = $ad['nivel'];    // Redireciona o visitante    header("Location: admin/area-do-administrador.php");    exit; } ?>

 

????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aparentemente não me parece ter erro no código, mas acho que pode ser essa primeira verificação quanto ao num_rows ... Por que é a partir dela que as outras são verificadas ... Realiza o teste sem ela só perguntando direto qual o nível ...

 

if (mysql_num_rows($query) != 1) {


Você pode também tentar seguir esse tutorial que o Thiago disponibiliza no site dele , está bem explicativo, e semelhante com a sua necessidade ...

 

http://blog.thiagobelem.net/como-criar-um-sistema-de-login-com-niveis-de-permissao/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém pode me ajudar?



Alguém pode me ajudar?

 

 

Até agora o código está assim Bruno7, já tinha feito daquela maneira que vc mencionou acima, aproveite e fiz umas modificações e mesmo assim não funcionou segue abaixo o código!
Com essa modificação não consegui ter acesso ao main.php se (1) e a area-do-administrador.php
se (2)

Desde já obrigado a todos!

<?php include 'config.php'; 

// Verifica se houve POST é vazio 
if (!empty($_POST) AND (empty($_POST['_user']) OR empty($_POST['_pass']))) {    
header("Location: index.php");    exit; 
} 

$usuario = mysql_real_escape_string($_POST['_user']); 
$senha = mysql_real_escape_string($_POST['_pass']); 

$sql = "SELECT id, nome, nivel FROM from_cad_user WHERE (login = '" . $usuario . "') AND (senha = '" . sha1($senha) . "') AND (ativo = 1) LIMIT 1"; 

$query = mysql_query($sql); 
$nivel = mysql_num_rows($query); 

if (mysql_num_rows($query) != 1) {    
header("Location: ../index.php");    
echo '<script> alert("Login ou Senha inválidos!");</script>';    
exit; 

} else if ($nivel == 1) {    
// Salva os dados na variável $op   

$op = mysql_fetch_assoc($query);    
// Se a sessão não existir, inicia uma    

if (!isset($_SESSION))       
session_start();    

// Salva os dados encontrados na sessão    
$_SESSION['UsuarioID'] = $op['id'];    
$_SESSION['UsuarioNome'] = $op['nome'];    
$_SESSION['UsuarioNivel'] = $op['nivel'];    

// Redireciona o visitante    
header("Location: pg-operation.php"); 

} else if ($nivel == 2) {
    
// Salva os dados na variável $ad    
$ad = mysql_fetch_assoc($query);
    
// Se a sessão não existir    
if (!isset($_SESSION))       
session_start();    
// Salva os dados na sessão   
$_SESSION['UsuarioID'] = $ad['id'];    
$_SESSION['UsuarioNome'] = $ad['nome'];    
$_SESSION['UsuarioNivel'] = $ad['nivel'];    
// Redireciona o visitante    
header("Location: admin/area-do-administrador.php");    
exit; 
} 

?>



????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você esta setanto o nível de usuário com o total de linhas encontradas no banco, vai sempre dar 1 ou 0

$nivel = mysql_num_rows($query);

o correto seria utilizar mysql_fetch_assoc, reveja sua lógica amigo. :thumbsup:

 

outra coisa para que dois mysql_fetch_assoc?

ad e op, só um basta!

 

Corrige e poste aqui novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Williams ficou assim até agora!

Testei digitei o login e senha, quando a validação começou a ser feita a tela ficou toda branca e sem nada.

 

Mas também tenho uma dúvida é necessário utilizar o a coluna nivel do banco na WHERE?

 

assim:

 

(nivel = '" . $user . "')

 

:seta: Código de validação de usuários:

 

 

<?php
include 'config.php';

// Verifica se houve POST e se o usuário ou a senha é(são) vazio(s)
if (!empty($_POST) AND (empty($_POST['_user']) OR empty($_POST['_pass']))) {
   header("Location: ../index.php");
   exit;
}

$usuario = mysql_real_escape_string($_POST['_user']);
$senha = mysql_real_escape_string($_POST['_pass']);

// Validação do usuário/senha digitados
$sql = "SELECT id, nome, nivel FROM from_cad_user WHERE (login = '" . $usuario . "') AND (senha = '" . sha1($senha) . "') AND (ativo = 1) LIMIT 1";

$query = mysql_query($sql);
$user = mysql_fetch_assoc($query);

//if (mysql_num_rows($query) != 1)
if (mysql_num_rows($query) != 1) {
   // Mensagem de erro quando os dados são inválidos e/ou o usuário não foi encontrado
   header("Location: ../index.php");
   echo '<script> alert("Login ou Senha inválidos!");</script>';
   exit;
} else if ($user == 1) {
   // Salva os dados encontados na variável $resultado
   $op = mysql_fetch_assoc($query);

   // Se a sessão não existir, inicia uma
   if (!isset($_SESSION))
      session_start();

   // Salva os dados encontrados na sessão
   $_SESSION['UsuarioID'] = $op['id'];
   $_SESSION['UsuarioNome'] = $op['nome'];
   $_SESSION['UsuarioNivel'] = $op['nivel'];

   // Redireciona o visitante
   header("Location: acesso-do-operador.php");

} else if ($user == 2) {
   // Salva os dados encontados na variável $resultado
   $ad = mysql_fetch_assoc($query);

   // Se a sessão não existir, inicia uma
   if (!isset($_SESSION))
      session_start();

   // Salva os dados encontrados na sessão
   $_SESSION['UsuarioID'] = $ad['id'];
   $_SESSION['UsuarioNome'] = $ad['nome'];
   $_SESSION['UsuarioNivel'] = $ad['nivel'];


   // Redireciona o visitante
   header("Location: acesso-do-administrado.php");
   exit;
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode utilizar o mysql_error() pra ver se está retornando algum erro na sua consulta , ou senão faça uma impressão com echo das variáveis que está utilizando como condição pra ver qual valor elas estão assumindo ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, já fiz mas ainda também não funcionou e não exibe nenhum erro. Vou testar os echos agora

 

 

$sql = "SELECT id, nome, nivel FROM from_cad_user WHERE (login = '" . $usuario . "') AND (senha = '" . sha1($senha) . "') AND (ativo = 1) LIMIT 1" OR (mysql_error());

 

 

Você pode utilizar o mysql_error() pra ver se está retornando algum erro na sua consulta , ou senão faça uma impressão com echo das variáveis que está utilizando como condição pra ver qual valor elas estão assumindo ...



Poxa Bruno7 tava funcionando, validando com os 2 includes fui corrigir e agora não to conseguindo resolver isso amigo!

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
include 'config.php';

// Verifica se houve POST e se o usuário ou a senha é(são) vazio(s)
if (!empty($_POST) AND (empty($_POST['_user']) OR empty($_POST['_pass']))) {
   header("Location: ../index.php");
   exit;
}

$usuario = mysql_real_escape_string($_POST['_user']);
$senha = mysql_real_escape_string($_POST['_pass']);

// Validação do usuário/senha digitados
$sql = "SELECT id, nome, nivel FROM from_cad_user WHERE (login = '" . $usuario . "') AND (senha = '" . sha1($senha) . "') AND (ativo = 1) LIMIT 1";

$query = mysql_query($sql) or die (mysql_error() );

//if (mysql_num_rows($query) != 1)
if (mysql_num_rows($query) <= 0 ) {

   // Mensagem de erro quando os dados são inválidos e/ou o usuário não foi encontrado
   header("Location: ../index.php");
   echo '<script> alert("Login ou Senha inválidos!");</script>';
   exit;
   
} else {
 
	// Salva os dados encontados na variável $obj
	$obj = mysql_fetch_object($query) ;

	// Se a sessão não existir, inicia uma
    if (!isset($_SESSION))
		session_start();

	// Salva os dados encontrados na sessão
	$_SESSION['UsuarioID'] = $obj->id;
	$_SESSION['UsuarioNome'] = $obj->nome;
	$_SESSION['UsuarioNivel'] = $obj->nivel;
	
	if( $obj->nivel === 1){
		
		//mysql_free_result($obj); //limpa a memoria	
		header("Location: acesso-do-operador.php");
		
	} elseif($obj->nivel === 2){
	
		//mysql_free_result($obj); //limpa a memoria	
		header("Location: acesso-do-administrado.php");
		
	} else {
		
		//mysql_free_result($obj); //limpa a memoria
		//usuario não autorizado
	}	
}
?>

Substitui mysql_fetch_ASSOC por mysql_fetch_OBJETC, e eu prefiro PDO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Williams, fiz como vc tinha descrito abaixo, porém deu erro "no-object", graças a linha error() do mysql ficou fácil corrigir, aí modifiquei o código para "Array" e funcionou!

 

logo mais estarei postando a solução para ajudar aí os colegas de alguma maneira.

Mesmo assim muito obrigado amigo!

 

 

 

<?php
include 'config.php';

// Verifica se houve POST e se o usuário ou a senha é(são) vazio(s)
if (!empty($_POST) AND (empty($_POST['_user']) OR empty($_POST['_pass']))) {
   header("Location: ../index.php");
   exit;
}

$usuario = mysql_real_escape_string($_POST['_user']);
$senha = mysql_real_escape_string($_POST['_pass']);

// Validação do usuário/senha digitados
$sql = "SELECT id, nome, nivel FROM from_cad_user WHERE (login = '" . $usuario . "') AND (senha = '" . sha1($senha) . "') AND (ativo = 1) LIMIT 1";

$query = mysql_query($sql) or die (mysql_error() );

//if (mysql_num_rows($query) != 1)
if (mysql_num_rows($query) <= 0 ) {

   // Mensagem de erro quando os dados são inválidos e/ou o usuário não foi encontrado
   header("Location: ../index.php");
   echo '<script> alert("Login ou Senha inválidos!");</script>';
   exit;
   
} else {
 
	// Salva os dados encontados na variável $obj
	$obj = mysql_fetch_object($query) ;

	// Se a sessão não existir, inicia uma
    if (!isset($_SESSION))
		session_start();

	// Salva os dados encontrados na sessão
	$_SESSION['UsuarioID'] = $obj->id;
	$_SESSION['UsuarioNome'] = $obj->nome;
	$_SESSION['UsuarioNivel'] = $obj->nivel;
	
	if( $obj->nivel === 1){
		
		//mysql_free_result($obj); //limpa a memoria	
		header("Location: acesso-do-operador.php");
		
	} elseif($obj->nivel === 2){
	
		//mysql_free_result($obj); //limpa a memoria	
		header("Location: acesso-do-administrado.php");
		
	} else {
		
		//mysql_free_result($obj); //limpa a memoria
		//usuario não autorizado
	}	
}
?>

Substitui mysql_fetch_ASSOC por mysql_fetch_OBJETC, e eu prefiro PDO

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.