Como garantir um login único no sistema?

Pessoal, terei em breve um sistema hospedado em meu servidor, que será usado por algumas empresas clientes. Um dos quesitos que irá influenciar na mensalidade destes clientes é a qtde de logins simultâneos (como no scriptcase). Como o sistema é via internet e não intranet, o uso do ip do cliente não serve, pois ele poderia acessar de várias estações de sua rede interna ao mesmo tempo, usando sempre o mesmo usuário e, neste caso a resolução nat do modem do cliente me daria sempre o ip externo dele. Preciso arrumar uma forma de cercear o uso do sistema por cliente e login, para que seja possível logar uma única vez.
Eu poderia tentar fazer o que o SC faz, mas é difícil fazer um usuário executar um logoff ao terminar a sessão, e isso impediria um próximo login com o mesmo usuário.
Alguém já implementou algo parecido?

Rodrigo

Vai ter que fazer algo parecido com o que o sc faz, eu acho :-p

voce pode travar o session_id que a identificação da pessoa logada … mas alguma hora vc vai ter que controlar o tempo logado sem a pessoa fazer logout.

porque como vc mesmo falou, nem todo mundo faz logout, mas se a pessoa tem usuario e senha e foi pra outro computador uns 10 minutos depois e quizer entrar no sistema … acho que deveria deixar, entao vc teria que ter o controle de timeout pra liberar o acesso…

jaja dao mais sugestões

Sugeri que a rotina de login do Scriptcase fosse disponibilizada para nos usuários implementarmos nas nossas aplicações, não sei se vai ser atendida.

Cria uma tabela em memoria:
*Sessao_ID
*Usuario_Id
DataHora (timeStamp)

  • Chave exclusiva.

No menu vc tem algumas opções:
Pode criar uma div escondida com iframe chamando um script faz refresh a cada n segundos (30 segudnos por exmplo) que:
Localiza o registro baseado no id do usuário e sessão_php e atualiza a datahora.
Rastreia os registros e exclui aqueles cujo o tempo seja superior a 45 segundos (por exemplo).

No Login: acessa os registro com count(*) group by usuario logado <- aqui vc tem usuarios online.

A acada acesso a uma aplicação através do menu, atualize a datahora dessa tabela tb. e pode criar triggers emtodas as tabelas para tambem atualizar a datahora dessa tabela.

Para garantir o numero de acessos simultaneos tb pode fazer a verificação com count(*) group by usuarios a cada acesso de aplicação, e solicitar ao usuario se logar novamente.

Aqui vc consegue controlar o nro de usuários simultaneamente sem se preocupar com o fato do usuário não dar logout.

A queda de performance é minima pois a tabela é em memória.

Obrigado a todos pelas respostas!
Harold, ficou meio confuso pra mim, não sou tão bom nem de php nem no modo web de desenvolver. Vou estudar um pouco sobre sessões e como o php faz o controle disso, valeu pela ajuda!
De qualquer forma, talvez eu adote a forma como o sc faz, avisando que já existe um login ativo e perguntando se quer deslogar o anterior.
Rodrigo

tente imaginar um script atualizando a hora a cada 30 segundos do usuário que se logou (isso em background). Quando o usuário fechar o browser, vai ficar registada a última hora, quando o usuario entrar em outra sessão, um novo registro é gerado e o tempo começa a correr novamente, ficando um registro láa morto. Como controlar quantos estão online, pelo número de registros cujo o tempo é inferior a n segundos.
Não é complicado. Faço isso em meu sistema e funciona direitinho.

E ainda pode abrir um parametro na interface do sistema pro proprio usuario configurar.

Tipo … 10minutos para expirar a sessão …

.