Ir para conteúdo

POWERED BY:

Arquivado

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

Cristiano Cordeiro

Login simultaneo

Recommended Posts

A maneira mais fácil é criar um campo do tipo BOOLEAN 'esta_logado' na tabela do banco de dados e alterar para 1 assim que o usuário fizer o login.

Quando ele fizer logout, altere de volta para 0.

 

Só tem que tomar cuidado se ele tentar sair da sua página sem fazer logout. Para isso, talvez precise de um pouco de javascript...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas i se o pc desligar sozinho, haver uma queda de transmição da rede, ou o user estiver com javascript bloqueado? ao tentar se logar (por exemplo, apos uma queda de energia) na tabela estaria 1, então ele seria impossibilitado de se logar, mesmo que não há nenhuma conexão ativa no momento.Não tem um modo melhor pra fazer isso não? Es la pregunta

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei como, mas poderia fazer um sistema de inatividade que após 10 minutos sem atividade a tabela se alteraria para "0" novamente e deslogava o usuário.

 

Acho que da pra fazer por ip.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei no PHP.net, se você tem alguma habilidade com inglês, deveria dar uma olhada.

 

john at host89 dot net 22-Jan-2010 08:11
Hello all,

While working on a fully customized session management system I decided to add the ability to force a user from their session while within another administrative session. (Basically, as an admin I would see currently active sessions and then have the choice to end them immediately.) I had already written a decently secure session tracking and theft-prevention system (An independent session key is created and then changed every 5 pages/requests. Even AJAX calls use the key.) I have posted that code on another page here at PHP.net.

The solution I arrived at was to record session IDs as users log in (If a session ID changes the user is forced to login again - session key changes frequently instead) and then tie the entries to their user id, from which I could get their username, name, e-mail, etc. A final part is recording the time that their session ID is recorded so that a garbage collector could go through and delete old entries in the database. (IDs are recorded in a MySQL database.)

The code on the login page looks something like this, and is run well after the session has started and their credentials have been verified:

<?php
   # Quick! Record their session information so they can be off kicked by demand later. :-D
   $session_id=session_id();
   $savsessionquery="INSERT INTO admin_users_sessions (user_id, session_id) VALUES ('".$userid."', '".$session_id."') ON DUPLICATE KEY UPDATE session_id='".$session_id."'";
   $savesessionresult=mysql_query($savsessionquery, $sql);
   # And we won't care if it don't work. :-)
?>

That last comment is because if the insert fails, then that user is safe from kicking during their active session. (However, if they click "Home" it re-runs through the login.php file which will pick up on a bad password/disallowed login and kick them out via logout.php which unsets the cookie and variables and destroys the session.)

The table has 4 columns: id, user_id, session_id, and timestamp. id is an AUTO_INCREMENT (so it's not specifically inserted) and TIMESTAMP is an AUTO-UPDATE (and so it also is not specifically inserted).

The code that actually kicks them out while maintaining the administrative session is as follows ($_POST['kickid'] is passed from the page where the user can pick the session to kill):

<?php
   session_cache_limiter('nocache');
   require('authheader.php');

   $permissiontocheck="permission5";
   require('permissioncheck.php');

   $kickid=$_POST['kickid'];

   # Alright. Save the current session stuff so we can resume it at the end.
   $realsessionid=session_id();

   # Look up the session ID we're kicking
   $query="SELECT session_id FROM admin_users_sessions WHERE id='".$kickid."'";
   $result=mysql_query($query, $sql);
   if (!$result || mysql_num_rows($result)!=1)
   {
       # No result or too many matches
       $_SESSION['returnstatus']=2;
       $_SESSION['returnmessage']="Invalid session selection. Please try again.";
       header ('Location: forcelogout.php');
       exit;
   }
   $array=mysql_fetch_row($result);
   $kicksessionid=$array[0];

   # Ok. End the current session and start one up with the ID being kicked.
   session_commit();
   session_id($kicksessionid);
   session_start();

   # Now we're in. Destroy some stuff and then get out.
   $_SESSION = array();
   $_SESSION['loggedin']=false;
   session_destroy();
   session_commit();

   # Sweet. Now we re-load our current session and head back celebrating.
   session_id($realsessionid);
   session_start();
   $_SESSION['returnstatus']=1;
   $_SESSION['returnmessage']="Session successfully destroyed";
   header ('Location: forcelogout.php');
   exit;
?>

authheader.php and permissioncheck.php are both portions of the session management system that this page runs under. permission5 is the required permission to kick a user from their session.

There you go! Dig in and I hope somebody can use this little tid-bit of code.

 

 

Basicamente, o cara faz um sistema onde os Administradores podem invalidar a sessão de usuários. Usando essa ideia, você pode fazer com que sempre que o usuário logar em um local diferente (com uma session_id diferente), você derruba ele da primeira sessão. Assim, você não terá o mesmo usuário em diversos locais e, em caso de ele sofrer uma queda de energia ou qualquer evento remoto como esse, você simplismente deixa ele logar denovo, o próprio sistema vai encarregar de derrubar a sessão que sofreu queda.

Já no caso de uma máquina não poder logar mais de uma conta, se você arrumar solução, posta pra gente. Já pesquisei para saber se PHP pode obter o MAC Address do cliente, mas dizem que seria falha na segurança dos conceitos da Internet.

Particularmente, eu queria pegar o MAC e o IP e salvá-los e ainda assim seria fácil de burlar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho bloqueio de login simultâneo um trabalho cujos benefícios não o justificam. O usuário tem uma senha. O que ele faz com ela não é problema do sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho bloqueio de login simultâneo um trabalho cujos benefícios não o justificam. O usuário tem uma senha. O que ele faz com ela não é problema do sistema.

 

Isso é válido quando se está falando de Sistemas de gestão ou coisas do tipo. Leve para o lado dos jogos, mais especificamente RPG que você encontrará problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não tem como por o id da pessoa como nome da session, e depois fazer uma busca, caso seja encontrado retorna true, caso não seja encontrado retorna false, depois com um simples if(resultado($id) == true){ header("location: alguma coisa"); }else{ resto do script }. Se essa logica for aproveitavel, como usaria para por nome session_name("nome"), ou colocaria session_start("nome"), e como faria essa busca

Compartilhar este post


Link para o post
Compartilhar em outros sites

não tem como por o id da pessoa como nome da session, e depois fazer uma busca, caso seja encontrado retorna true, caso não seja encontrado retorna false, depois com um simples if(resultado($id) == true){ header("location: alguma coisa"); }else{ resto do script }. Se essa logica for aproveitavel, como usaria para por nome session_name("nome"), ou colocaria session_start("nome"), e como faria essa busca

O problema dessa ideia é que você precisaria trabalhar com todas as sessões ativa e meu conhecimento limitado não me permite arrumar uma solução dessas.

Não sei se é possível, mas no meu modo de ver, Sessão é quase que um Cookie, porém a Sessão fica no servidor e o Cookie fica no client. Mas ainda assim, quando um navegador é aberto em uma determinada página que inicia uma sessão, é anotado um registro de comunicação entre esse específico navegador com o servidor e, sempre que algo da sessão for requerido, o servidor sabe de qual sessão se está falando.

Eu não acho que você vá conseguir fazer com que um usuário A, ao tentar logar, cheque sessões de usuários B e C, uma vez que isso seria como adquirir informações restritas de outros usuários.

 

O que você pode fazer é salvar o session_id() junto com o user_id em uma tabela. user_id seria um campo do tipo único e toda vez que você tentar inserir um usuário lá e ele já estiver lá ou você atualiza o session_id de lá (fazendo com que a sessão anterior pare de funcionar) ou você não deixa o cara logar (deixando de criar a nova sessão).

A primeira opção é melhor porque automaticamente resolve problemas de quedas inesperadas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara vou lhe dar uma dica que eu utilizo aki...

 

na minha atbela de usuarios eu crio um campo onde eu atualizo o time() a cada 10 segundos via ajax (javascript) e quando o usuário for logar no sistema ele verifica se o ampo onde você esta atualizando o time jah passou de 10 segundo.. se passou ele deixa logar..

 

Assim dessa forma você consegue controlar se o usuário não clicou no botão de deslogar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha fiz um exemplo bem simples.. pega a idéia dele e implementa no seu sistema...

 

Extrutura do banco

usuarios

usr_id - int 11

usr_login - varchar 250

usr_senha - varchar 250

usr_tempo - int 11

 

 

 

logar.php

<?php
require("conexao.php");

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

$tempo = time()-5;

$sql = mysql_query("SELECT * FROM usuarios WHERE usr_login='$login' AND usr_senha='$senha' AND usr_tempo < '$tempo'");

if (mysql_num_rows($sql) > 0) {
	header("Location: pagina_sistema.php");
} else {
	echo "Login ou Senha incorreta ou usuário já logado no sistema";
}
?>

 

 

pagina_sistema.php

<script>
loop();
function loop() {
var id = <?php echo $usr_id; ?>;
// ATUALIZA TIME DO USUARIO
$.ajax({ url: "acoes.php", type: "POST", data: "acao=atualiza&id=" + id, async: false });
setTimeout('loop()', 5000); // FAZ O LOOP A CADA 5 SEGUNDOS
}
</script>

 

 

acoes.php

<?php
require("conexao.php");

$acao = $_POST['acao'];
$id = $_POST['id'];

$tempo = time();
if ($acao == "atualiza") {
	mysql_query("UPDATE usuario SET usr_tempo='$tempo' WHERE usr_id='$id'");
}
?>

 

soh resaltando.. eu fiz esse de cabeça rapidão... não sei se esta funcionando, mas a idéia principal eh essa...

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.