Ir para conteúdo

POWERED BY:

Arquivado

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

SRL_23

[Resolvido] Bloqueio de acesso simultâneo

Recommended Posts

Tenho uma aplicação que não pode ser acessado em locais diferentes, tipo o usuário não pode logar já estando logado no sistema.

Minha idéia é, mostrar pro usuário que ele já ta logado em outro terminal e da a opção de fechar a sessão do outro terminal e abrir outra no terminal atual.

 

Bom! Sou limitado em cake e não sei muita coisa ainda mas to tentando fazer gravando um campo no banco de dados Usuario.logado

 

meu app_controlle

	function beforeRender() {
		//Verifico se o usuario logou
		if($this->Auth->user('id')){
			$this->loadModel('Usuario');
			//Faço abusca no bd
			$busca_bd = $this->Usuario->find('first',array('conditions'=>array('Usuario.id'=>$this->Auth->user('id')),'recursive'=>-1));
			if($busca_bd['Corretor']['logado']=="on"){
			    echo "você ja esta logado em outro terminal efetue logout"; 
			}
		}
	}

 

Meu logout

   function logout() {
$this->Corretor->id=$this->Auth->user('id');
$this->Corretor->saveField('logado', "off");
       $this->redirect($this->Auth->logout());
   }

 

Bom como podem perceber isso nao serve pra nada, pois somete informa que o usuario esta logado em outro terminal pq o status dele ta como Usuarior.logado=on

isso no maximo serve pra mostrar usuarios online e dizer que ele nao passou pelo processo de logout pois nao gravou no bd Usuario.logado=off.

 

O texto ta longo :P

 

Gostaria de saber se tem como eu saber se o usuario ta logado ou nao pelo cake?

Se o cake tem algum recurso pra isso tipo sessao?

E se tiver se tem como tipo eu destruir essa sessão e criando outra?

 

Bom é isso nao sei se expliquei bem!! Mas obrigado pela ajuda que vier ^^. :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se entendi.

Se eu acessar seu sistema pelo firefox e depois tentar acessá-lo pelo IE8, serei barrado e uma mensagem será exibida para mim. Se for isso, eu acredito que não dá para fazer com sessões ou cookies. Sua ideia de usar tabelas parece bem adequada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum vlw, eu implementei o codigo e coloquei um campo novo no bd "ip" ai eu salvo o ip do usuario e zero quando ele fizer logout do sistema, bom isso pelo mesnos serve pra mostrar que tem um outro ip acessando o sistema com aquele username.

 

Nao posso bloquear se nao vai ficar tipo um jogo de ping pong entre os 2 terminais (1 deslogando o outro), entao resolvi colocar apenas um informativo como no gmail.

 

Bom nao ficou 100% e os meus supervisores nao gostaram muito dessa solução :( mas fazer oq to analizado e vendo outras formas.

 

Galera se alguem souber de outra forma de bloquear ajuda ai.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estou 'vendo' nenhuma utilidade em evitar n conexões simultâneas. Se o usuário só acessa o sistema por meio de um nome de usuário único e senha, qualquer acesso simultâneo é provocado pelo mesmo usuário. Se alguém 'bagunçar' a conta dele, o problema é dele não seu. O que você pode fazer é destruir a sessão de login após 5 minutos sem qualquer ação do usuário, por exemplo.

você pode argumentar com seus supervisores que nem o google evita acesso simultâneos e que bancos mantém controle sobre o tempo ocioso da sessão e não sobre o o número de acessos ao mesmo tempo. O Itaú faz isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O cake não tem nada pronto pra isso. Sugiro que crie uma tabela "logados", lá insira "id", "usuario_id" e "validade_sessao". Se existir um registro nessa tabela para um usuario, significa que ele esta logado. o validade_sessao (DATETIME) é quando um cookie auth está programado para expirar, assim, se o usuário esqueceu de dar logout, mas a sessao já expirou você vai saber.

 

 

Aí é só checar:

                        if($this->Auth->user('id')){
                               $this->loadModel('Usuario');
                               //Faço abusca no bd
                               $busca_bd = $this->Logado->find('first',array('conditions' => array('Logado.usuario_id'=> $this->Auth->user('id')),'recursive'=>-1));

                               if(!empty($busca_db) && strtotime($busca_db['Logado']['validade_sessao']) >= 'data_aki'){
                                   $this->Session->setFlash('Você já está logado');
                                   $this->redirect('/');
                               }
                       }

 

Lembre-se no logout deletar os dados da tabela "logados" relacionado.

 

Essa é minha ideá, você tem que desenvolver o código ainda, mas a base está aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pessoal:

 

menino_levado:

 

realmete é estranho isso, mas parece que o cliente vai dar o acesso dele para outros logarem como adm :o :o :o :o :o

Uma grande quebra de segurança. :huh:

 

Trabalho em uma empresa em que "o cliente sempre tem rasao" e nao tenho muita escolha :( .

 

lucaswxp:

Muito boa a sua ideia vou implementar aqui.

 

Bom galera espero que esse topico ajude muitos outros colegas.

 

Pode colocar como resolvido vlw.

 

abs

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.