Evitando logar em mais de um navegador/pc com o mesmo usuario e senha ao mesmo tempo

404 views
Skip to first unread message

elton santos

unread,
Jan 11, 2013, 10:16:58 PM1/11/13
to django...@googlegroups.com
Como fazer pra evitar logar no msm sistema enquanto tiver logado...

Exemplo:
me logo no firefox e to mexendo e tal, dai abro o chrome pra logar ou outro pc pra me logar com o msm usuario e senha, dai vai da uma msg de erro dizendo q o usuario ainda esta logado e q eh necessario deslogar(ou eh necessario fechar a sessao, etc).

Tem como isso?

Hernani Fernandes

unread,
Jan 11, 2013, 10:34:32 PM1/11/13
to django...@googlegroups.com
cara.. pensei em algo simples como:

1 -  ao logar você gravar o ip do usuário e coloca o status como ativo e ao sair (pelo botão sair) você colocar o status como inativo.. 
2 - ao tentar logar vc verifica se o ip possui o status ativo.. e solicita que ele feche a sessão aberta..

isso pode trazer um problema .. se o cara fechar o browser e não encerrar a sessão .. por isso precisa verificar as atividade dele... podendo controlar através de um middleware...facilmente encontrado com sistemas de login...

bom.. espero que oriente.. é uma pequena forma.. talvez tenha algo pronto .. mas desconheço.

Rafael Chagas

unread,
Jan 12, 2013, 8:49:34 AM1/12/13
to django...@googlegroups.com
No settings.py você pode forçar a fechar a sessão quando navegador for fechado.

# settings.py
SESSION_EXPIRE_AT_BROWSER_CLOSE = True


                     Rafael Chagas Barbosa
Bacharel em Sistemas de Informação - Universidade Estadual de Montes Claros

 


2013/1/12 Hernani Fernandes <hern...@gmail.com>
--
 
 

Hernani Fernandes

unread,
Jan 12, 2013, 11:56:56 AM1/12/13
to django...@googlegroups.com
agora sim ficou simples! essa eu não sabia ! valeu Rafael Chagas!

Guilherme Kuhn

unread,
Jan 12, 2013, 12:22:44 PM1/12/13
to django...@googlegroups.com
Mas isso ainda não responde a pergunta original.
O método que o Hernani disse, me pareceu complexo demais para algo que deve ser simples.

O django trabalha com sessões, onde cada sessão representa um usuário logado. Enquanto a sessão estiver ativa o usuário estará logado.
Consequentemente ao invalidar uma sessão pode-se forçar o usuário daquela sessão a fazer o login novamente.

Eu seguiria por esta linha. Verificando se o usuário que está tentando logar já possui uma sessão ativa, e invalidando a sessão "antiga" sem bloquear o novo login.


--
 
 



--


elton santos

unread,
Jan 15, 2013, 1:32:17 PM1/15/13
to django...@googlegroups.com
Acho q seria tipo isso, penso em fazer assim (apesar de nao saber como começar, mas pensei na logica)

Tipo, o usuario loga...
Se ele tentar logar em outro navegador/pc dirá que uma sessao com esse usuario ja esta logada, ate ai tudo bem.
mas se o usuario logado, nao fizer nada, durante, sei la, 10 min, aparecerá um alert dizendo que sua sessao ira expirar em XX minutos se nao fizer nada...
Se ele nao fizer nada, fecha a sessao e volta pra tela de login, se fizer, a contagem recomeça, 10 min por exemplo...

Isso evita, por exemplo que o usuário somente feche o browser sem fechar o a sessao (clicando no botao sair)

O que vcs acham? Brigadao galera!! Vcs são feras demais!

Felipe Prenholato

unread,
Jan 16, 2013, 3:04:18 PM1/16/13
to Django Users BR
Simplifica as coisas....

Use um middleware para expirar a sessão depois dos 10 minutos. Tudo o que vc precisa é uma entrada na sessão com a data do ultimo request (stack overflow tem uns exemplos). Normalmente se ignora requests ajaxs.

Se precisar mesmo que o usuário só tenha uma sessão logada (e pense bem nisso, pois uma única sessão ativa é um saco as vezes), ao logar, expire ou exclua todas as sessões ativas do usuário. (você vai precisar manter um cache de usuario: sessid pois o django guarda o user da sessão codificado nela)

Dessa maneira, a única sessão ativa vai ser a última máquina/browser que ele logou, mas, novamente, pense bem sobre isso. Expirar a sessão por inatividade deve ser mais que suficiente, pois mesmo se o user não 'sair', em até X minutos a sessão expira.

Se você ainda quiser avisar ao usuário sobre quanto tempo de sessão ele tem, nem precisa consultar de facto. Vc configura o tempo de inatividade para 30min, se a página carregou a 25, vc sabe que só sobra 5 minutos.

Se for o caso de paranoic mode quanto a esses 30min, diminui para tipo 2 minutos e renova com um url via ajax para não estragar a exp de usuário.

Boa sorte ;)

Felipe 'chronos' Prenholato.
Linux User nº 405489
Home page: http://devwithpassion.com | http://chronosbox.org/blog
GitHub: http://github.com/chronossc/ | Twitter: http://twitter.com/chronossc


--
 
 

Lucas Porto

unread,
Nov 21, 2016, 2:11:36 PM11/21/16
to Django Brasil
Estive trabalhando nessa solução e cheguei nesse algoritmo:

# Pega as sessões ativas
    sessoes_ativas = Session.objects.filter(expire_date__gte=timezone.now())
    sessoesRequest = []
    ultimaSessao = []
    sessoesEncerrar = []

    for sessoes in sessoes_ativas:
        # Das sessões ativas pega aquelas que pertence ao usuario do request
        try:
            if sessoes.get_decoded()["_auth_user_id"] == request.session.load()["_auth_user_id"]:
                sessoesRequest.append(sessoes)
        except:
            pass
    entrar = True
    # Das sessões dos usuario do request, armazena em um array as que deveram ser encerradas
    # no caso seriam as mais antigas, deixando apenas a ultima sessao ativa.
    for sessoes in sessoesRequest:
        if entrar:
            ultimaSessao.append(sessoes)
            entrar = False
        if ultimaSessao[0].expire_date < sessoes.expire_date:
            sessoesEncerrar.append(ultimaSessao.pop(0))
            ultimaSessao.append(sessoes)
    # Encerra as sessões.
    for sessoes in sessoesEncerrar:
        request.session.delete(sessoes.session_key)


Procure usar na view que aponta para o seu index, pois sempre que alguem logar e ser redirencionado para lá, o algoritmo ira encerrar  todas as sessões ativas do usuário, deixando apenas a que ele acabou de logar
Reply all
Reply to author
Forward
0 new messages