Login e Logout

13 views
Skip to first unread message

Leonardo Ribeiro

unread,
Aug 31, 2011, 7:23:31 AM8/31/11
to fle...@googlegroups.com
Pessoal,

Preciso implementar em uma app flex4 login e logout.
o login já é feito (com menus sendo criados dinamicamente de acordo
com os direitos do usuário), mas eu preciso de 2 coisas mais:

1 - guardar o usuário logado para que não seja possível logar
com o mesmo usuário duas vezes (mesmo browser outra aba, outra janela
do mesmo browser ou outro browser - chrome e firefox por exemplo)

2 - ter opção de logout nas seguintes situações:
2.1 - um botão "logout" na app
2.2 - ao fechar o browser
2.3 - ficar um determinado tempo sem usar a app

para todos os casos de logout acima precisaria gravar um log no BD.

Inicialmente não queria ter uma tabela para guardar o usuários logados,
preferiria ter algum controle de sessão mesmo, se possível

--
[]'s
Leonardo

Linux User #488650
Ubuntu User #27045
Mais sobre o Ubuntu em português: http://www.ubuntu-br.org/comece

Leonardo Ribeiro

unread,
Aug 31, 2011, 7:26:11 AM8/31/11
to fle...@googlegroups.com
Ah uma coisa que esqueci de mencionar no e-mail origial é que
a app usar Flex 4 + BlazeDS + Java no server (com Spring e Hibernate)


2011/8/31 Leonardo Ribeiro <leojr...@gmail.com>

Rodrigo Valentim

unread,
Aug 31, 2011, 7:59:16 AM8/31/11
to fle...@googlegroups.com
Leonardo,

  Certa vez precisei fazer algo parecido e funcionou....

A ideia original foi essa http://www.cauirs.com.br/rafael/?p=119

Porém, se tu pesquisar por controle de usuário flex no google, aparece outros exemplos.

a forma que fiz foi mais simples. Todo usuário logado eu guardo em um array

--
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para fle...@googlegroups.com
Para sair da lista, envie um email em branco para flexdev-u...@googlegroups.com
Mais opções estão disponíveis em http://groups.google.com/group/flexdev



--
Atenciosamente,
Rodrigo Valentim

Rafael Bandeira Rodrigues

unread,
Aug 31, 2011, 10:09:43 AM8/31/11
to fle...@googlegroups.com
Olha eu posso até estar errado, até porque não sei a sua necessidade de login. Mas states não te resolveria?

um botão "logout" na app:
Um botão voltando ao state "login"
ao fechar o browser: Se você tem um state default como "login" funcionaria da mesma forma
ficar um determinado tempo sem usar a app: Um timer disparado sempre que o fulano não tiver atividades de maouse e teclado resolveria.

Uma coisa que penso a respeito do flex é  que ele reproduz na web, o ambiente desktop, então o timer bloqueando a tela como se fosse um protetor é válido, mas não fazendo o que as sessions fazem do tipo "perder toda a operação porque a session morreu".

Não trabalho com Spring e Hibernate até porque minhas aplicações são em ColdFusion e limito os acessos ao server apenas as operações de crud, já que o flex tem autonomia para muitas coisas. Se o seu objetivo é ter um tipo de session do Flex, eu recomendaria a utilização do SharedObject, você pode fazer login, receber os dados do server e salvar nele para recuperar como uma session.


Obrigado,

Rafael Bandeira Rodrigues
Chief Executive Officer
FlagNet - Soluções em Tecnologia
http://www.flagnet.inf.br/

Adobe ColdFusion 8 Certified Expert
Adobe ColdFusion MX 7 Certified Developer
Adobe Certified Professional
Adobe Certified Instructor
Adobe Certified Expert
Fusebox - BRASIL
http://www.fusebox.com.br/
RafaBand - BlogSpot.com
http://rafaband.blogspot.com/
FlagNet - Twiter
http://twitter.com/flagnet/

"Pensar apenas ou desejar somente nunca levou ninguém a lugar nenhum. É necessário também a ação" - William Shakespeare



--

Pedro Augusto Clemente de Melo

unread,
Aug 31, 2011, 10:12:33 AM8/31/11
to fle...@googlegroups.com
Leonardo,

Há pouco mais de um mês estava com o mesmo problema. Devo te avisar que não é algo tão trivial. Trabalho com um projeto com configurações bem semelhantes ao seu (uso Flex3 ao invés de 4).

No BlazeDS existem classes chamadas "FlexSession" e "FlexContext". Com essas classes, no Java você consegue guardar uma referência para cada instância de um cliente Flex que você tiver.

Esta referência é por instância de browser no cliente (duas abas do firefox são uma mesma FlexSession e duas janelas são duas FlexSessions, não sei como ficaria no caso do Chrome onde você brinca com as abas jogando-as de uma janela para outra).

A partir disso é possível implementar o login, logout e o timeout por sessão inativa. O problema é que ele só vai identificar uma atividade na sessão quando houver uma requisição para o servidor. No meu caso, existem formulários muito longos a serem preenchidos e a sessão dá timeout mesmo com o usuário trabalhando. Não recorri à requisições esporádicas para manter a sessão aberta por isto não seria escalável em produção.

Pelo menos no Flex3 existe um evento chamado "IDLE" que pode ajudar neste problema. Não estudei mais afundo por que tenho demandas com prioridade maior no momento.

Espero ter ajudado e se você achar alguma solução, por favor, compartilhe!

Abraço
Pedro Augusto Clemente de Melo - PACM
Ciência da Computação 2007-2
(81) 8795-1112

Leonardo Ribeiro

unread,
Aug 31, 2011, 3:11:18 PM8/31/11
to fle...@googlegroups.com
@ Rodrigo

Após ler as opiniões e sugestões dos colegas da lista resolvi testar a sua solução e tenho algumas perguntas:

Se eu subo o tomcat e faço o login na aplicação, o usuário é colocado na sessão e se fico mais do que o tempo 
configurado para o timeout o usuário é retirado de (usuariosLogados) e (abaixo o log)

FlexClient destruido: 63016449-9108-234B-F067-F4F2C10DD6B8 Wed Aug 31 15:53:01 BRT 2011
Sessão destruida: Wed Aug 31 15:53:01 BRT 2011
Sessão criada: Wed Aug 31 15:53:01 BRT 2011
FlexCliente criado: 63016449-9108-234B-F067-F4F2C10DD6B8 Wed Aug 31 15:53:01 BRT 2011

FlexClient e sessao destruida e recriada...

Se eu continuo a não utilizar no console eu vejo o mesmo log

FlexClient destruido: 63016449-9108-234B-F067-F4F2C10DD6B8 Wed Aug 31 15:59:15 BRT 2011
Sessão destruida: Wed Aug 31 15:59:15 BRT 2011
Sessão criada: Wed Aug 31 15:59:15 BRT 2011
FlexCliente criado: 63016449-9108-234B-F067-F4F2C10DD6B8 Wed Aug 31 15:59:15 BRT 2011

É isso mesmo?

Outra coisa é que mesmo eu ficando tempo sem usar se eu tentar por exemplo fazer
um cadastro eu consigo sem problema...



2011/8/31 Pedro Augusto Clemente de Melo <pedro...@gmail.com>

Rodrigo Valentim

unread,
Sep 1, 2011, 9:18:46 AM9/1/11
to fle...@googlegroups.com
Sim. O Tomcat remove sua sessão apos o timer.. meu timer aqui é de 5minutos... então, dessa forma o usuário pode passar 1 hora olhando pro monitor e a sessão não cai devido ao metodo pingSession() que existe no java... esse metodo é apenas para manter a comunicação viva... e assim, a sessão também (imagine você preenchendo um formulario que só manda pro java qdo acaba tudo... a sessão vai morrer, então você implementa um timer no flex que faz uso do remoteObject chamando esse metodo pingSession() (ou qualquer outro nome).

Exatamente desta forma, consegui resolver meu problema para guardar o usuário logado... nunca mais tive problemas com isso!

Rafael Bandeira Rodrigues

unread,
Sep 1, 2011, 10:31:50 AM9/1/11
to fle...@googlegroups.com
Rodrigo a título de curioside, até porque esse assunto me interessa.

Do ponto de vista "funciona" eu entendi a solução, mas do ponto de vista "solução" imagino que gere um problema. se você faz uma requisição a cada 5min para cada usuário para manter ele logado, isso não pode gerar um problema de acessos? se eu colocar 300 usuários dentro da aplicação isso gera 1 ping por segundo, e me gera uma necessidade de ter um server com maior capacidade de processamento.

Por outro lado, tirando funcionalidades como chat ou living data não vejo porque manter o user no server, uma vez que é possivel ter esse tipo de recurso de login atraves do SharedObject. Exsite algum beneficio nessa session no server?



Obrigado,

Rafael Bandeira Rodrigues
Chief Executive Officer
FlagNet - Soluções em Tecnologia
http://www.flagnet.inf.br/

Adobe ColdFusion 8 Certified Expert
Adobe ColdFusion MX 7 Certified Developer
Adobe Certified Professional
Adobe Certified Instructor
Adobe Certified Expert
Fusebox - BRASIL
http://www.fusebox.com.br/
RafaBand - BlogSpot.com
http://rafaband.blogspot.com/
FlagNet - Twiter
http://twitter.com/flagnet/

"Pensar apenas ou desejar somente nunca levou ninguém a lugar nenhum. É necessário também a ação" - William Shakespeare



Leonardo Ribeiro

unread,
Sep 1, 2011, 1:21:28 PM9/1/11
to fle...@googlegroups.com
Rodrigo,

Entendi, mas no caso de eu precisar realmente "dar logout" no usuário depois de certo tempo sem atividade essa abordagem não vai funfar neh?

@Rafael

Ele mantém o usuário no server para poder verificar no ato de um login se tal usuário já está logado no sistema.




2011/9/1 Rafael Bandeira Rodrigues <rafa...@gmail.com>

Rafael Bandeira Rodrigues

unread,
Sep 1, 2011, 1:56:29 PM9/1/11
to fle...@googlegroups.com
Ok isso seria um ponto, mas a verificação do estado login simultaneo da para resolver com o Producer e Consumer e o proprio SharedObject.

Aqui por exemplo tenho na aplicação, a criação do producer e consumer mediante o login que é feito por RemoteObject para uma consulta SQL que me retorna os dados do login a serem guardados no SharedObject. o Producer e Consumer tem esse controle de login para o modelo SaaS. Não cheguei a testar se o login feito com um intervalo longo existe esse reconhecimento de duplicidade, alias vou testar, mas acredito que isso funcione como o controle.

Enfim como falei estou só colocando minhas experiencias e tentando descobrir novos caminhos


Obrigado,

Rafael Bandeira Rodrigues
Chief Executive Officer
FlagNet - Soluções em Tecnologia
http://www.flagnet.inf.br/

Adobe ColdFusion 8 Certified Expert
Adobe ColdFusion MX 7 Certified Developer
Adobe Certified Professional
Adobe Certified Instructor
Adobe Certified Expert
Fusebox - BRASIL
http://www.fusebox.com.br/
RafaBand - BlogSpot.com
http://rafaband.blogspot.com/
FlagNet - Twiter
http://twitter.com/flagnet/

"Pensar apenas ou desejar somente nunca levou ninguém a lugar nenhum. É necessário também a ação" - William Shakespeare



Leonardo Ribeiro

unread,
Sep 1, 2011, 2:03:20 PM9/1/11
to fle...@googlegroups.com
Rafael,

Toda informação é válida. Eu tenho muito mais experiência em Java do que em Flex e quando surgiu essa necessidade a solução do Rodrigo me pareceu e parece muito interessante.
Quanto a usar Producer/Consumer e SharedObject eu nunca utilizei então infelizmente não tenho uma opinião a respeito mas vou atrás de mais informação eles.
De repente é uma alternativa.
Se puder dar uma breve explanada de como funciona o esquema de Producer/Consumer e SharedObject  pra mim seria de grande valia.

Att

Leonardo Ribeiro

unread,
Sep 1, 2011, 2:04:11 PM9/1/11
to fle...@googlegroups.com
Quanto a sua observação de ter muitas requisições de acordo com o número de usuários do sistema, eu também tenho essa interrogação na cabeça

2011/9/1 Leonardo Ribeiro <leojr...@gmail.com>

Rodrigo Valentim

unread,
Sep 3, 2011, 10:22:38 AM9/3/11
to fle...@googlegroups.com
@Rafael,

   Concordo em se preocupar com performance do servidor, porém, como a requisição do pingSession() só serve para "manter" a sessão viva... no pingSession() não tem nada. é um metodo vazio e sem retorno, então, não teriamos sequer um nano-segundo de processamento gasto para isso... bom, para o meu caso atendeu 100% minha necessidade. Trabalho com aproximadamente 1500 estações e está tranquilo até o momento.

@Leonardo,

  PAra dar logout você pode implementar algo que possa dar um kill na sessão ou remover o usuário do array (caso tenha implementado da mesma forma que o autor do artigo)

Rodrigo Valentim

unread,
Sep 3, 2011, 10:59:13 AM9/3/11
to fle...@googlegroups.com
@Leonardo,

Fiz um exemplo grosseiro e o meu processamento nao subiu nem 1% por isso.

                for (var i:int =0;i<100;i++) {
                    var remoteObj:RemoteObject = new RemoteObject();
                    remoteObj.destination = "session";
                    remoteObj.activeSessao();                   
                }           

Antes de implementar esse metodo, utilizei o Java VisualVM para ver o consumo geral de memoria / processamento e como no metodo nao tem absolutamente nada, é como se nada tivesse executando.


@Rafael,

Acredito sim que a implementação feita em sharedObject também resolva o problema... existem n opções para isso acontecer, porém, não posso ficar preso ao Flex que pra mim só é usado como camada de apresentação. Se amanhã ou depois quiser mudar para outra tecnologia, como ficaria ?

Obs. Também posso fazer uma trigger after logon e logoff para ter esse controle no banco.. solução tem, várias, só precisamos adequa-las a nossa necessidade.

Abraço
--
Atenciosamente,
Rodrigo Valentim
Reply all
Reply to author
Forward
0 new messages