troca de usuario logado
06/09/2010 00:00
0
Olá, estou tendo problemas com os usuarios logados no sistema que desenvolvi.

É um sistema de simulação de empresas que é usado em faculdades, onde geralmente os alunos se logam em um laboratório dentro da propria faculdade para utilizar o sistema. Como eles utilizam o sistema ao mesmo tempo acontece o seguinte:

Exemplo:

- O 'Aluno 1' acessa o sistema com seu login e senha e vai para a pagina inicial da sua empresa contendo no cabeçalho o seu nome e o nome de sua empresa. Toda navegação deste aluno dentro de sua empresa o sistema busca na sessão o ID deste aluno logado e vai no banco e busca as informacoes deste aluno e de sua empresa.

- Entao o 'Aluno 2' também acessa o sistema, de outra máquina do mesmo laboratório (mesma rede), e o sistema faz a mesma coisa, ao autenticar o aluno, coloca o seu ID na sessao e direciona para a pagina inicial da empresa deste aluno 2. E ele navega normalmente dentro de sua empresa.

- Depois que o 'Aluno 2' se logou no sistema, quando o 'Aluno 1' vai navegar dentro de sua empresa, a sua maquina assume os dados do 'Aluno 2' que se logou em outra máquina. Entao o 'Aluno 1' navega como se fosse o aluno 2.

- Se outro aluno se loga no sistema, entao os outros assumem o login deste ultimo logado. É como se a sessão onde guardo o ID dos usuarios logados fosse comum para todas as máquinas.

* Só que este problema só acontece em algumas faculdades, porque já testamos em vários lugares, e somente em 2 faculdades aconteceu o problema até hoje. Por isso imagino ser algum problema na rede deles, mas fizemos alguns testes lá e não conseguimos solucionar o problema.

Segue a classe do usuario:


package br.sde.admin

import java.io.Serializable

class Participante implements Serializable {

static final long serialVersionUID = 1L;

Equipe equipe
String nome
String email
String login
String senha

static belongsTo = Equipe

static constraints = {
nome(length:2..100,blank:false)
email(email:true)
login(unique:true,blank:false)
senha(size:5..20,blank:false)
equipe(nullable:false)
}

}


quando o usuario efetua login:


def participante = Participante.findByLoginAndSenha(params.login,params.senha)
if(participante) {
session.participante = participante.id
redirect(controller:"principal",action:"inicio")
}


assim recupero o usuario


def participante = Participante.get( session.participante )


Será mesmo problema na rede da faculdade, ou no meu codigo? Ou será que posso implementar algum controle adicional para evitar este problema?

Alguém já passou por algo assim? Não encontrei nada na internet que me ajudasse..

Obrigado.
Tags: Tópicos avançados


0
Uai, estranho isto. No seu controlador ou serviço não tem nenhum atributo estático não?
Se bobear, duas sessões podem estar acessando o mesmo atributo acidentalmente por causa disto.

Posta ai o seu código de autenticação pra que a gente dê uma olhada?


0
Aliás, dica: você pode armazenar um objeto na sessão também. Assim não precisa ficar buscando o usuário cada vez que necessite.


0
esse é o codigo do login para autenticar o usuario:


class LoginController {

def index = { redirect(action:login,params:params) }

def login = {
if (request.method == "GET") {
session.participante = null
def participante = new Participante()
flash.login = 'efetue o login'
redirect(controller:'central',action:'inicial')
} else {
def participante = Participante.findByLoginAndSenha(params.login,params.senha)
if(participante) {
participante.ultAcesso = participante.acesso
participante.acesso = new Date()
participante.numAcessos = participante.numAcessos + 1
participante.save()
session.participante = participante.id
redirect(controller:"principal",action:"inicio")
} else {
flash.login = 'login ou senha incorreta'
render(view:'/central/inicial')
}
}
}

def logout = {
session.participante = null
redirect(controller:'central',action:'inicial')
}

def direciona = {
render( view:'/central/direciona' )
}

}


e este verifica se o usuario esta logado quando navega no sistema, e todas os outros controllers com restricao extendem desta classe aqui:


abstract class BaseController {

// verifica se participante esta logado
def autParticipante() {
if(!session.participante) {
def originalRequestParams = [controller:controllerName,action:actionName]
originalRequestParams.putAll(params)
session.originalRequestParams = originalRequestParams
redirect(controller:'login',action:'direciona')
return false
}
}

}


é isso.

quanto a armazenar o objeto inteiro na sessao, eu estava fazendo isso, mas dai coloquei somente o id pq sugeriram para ver se diminuia o uso de memória, que estava alto, entao passei a guardar somente o id, e criei um filter que a toda solicitacao ele busca os dados e coloca em um request, mas nao vi diferenca na memoria.



class SessaoFilters {

def filters = {
all(controller:'*', action:'*') {
before = {
( session.participante )
request.participante = Participante.get( session.participante )
}
after = {

}
afterView = {

}
}
}

}

06/09/2010 00:00


0
que estranho isso. O que vc está usando ? Tomcat ? Glassfish ?
vc tem certeza que pega o id do aluno de session.participante, sempre ?

Herrera
08/09/2010 00:00


0
estou usando tomcat 6.

pois é também achei muito estranho, e eu sempre pego o id do participante.

então eu acredito que seja algum conflito na rede deles, pq já utilizei o sistema em varias outras faculdades e o problema não ocorre.

já tiramos o armazenamento em cache e fizemos alguns outros testes mas ainda não resolveu.
09/09/2010 00:00


0
carlinbegale, verifica se no ambiente deles estão utilizando algum tipo de cluster, seja virtual ou fisico, ja ocorreu um problema comigo na empresa onde trabalho que o cluster não trabalhava exatamente como um cluster, ele fazia um balanceamento de carga, então quando eu acessava e salvava um dado na sessão ficava gravado em uma parte do "cluster", ai quando entrava novamente, as vezes não tinha o dados gravado na sessão, ou até mesmo pegava algum dado da sessão de outro usuário logado no sistema.
09/09/2010 00:00


0
ok lucas, vou verificar isto junto a faculdade e assim que tiver um retorno eu posto aqui.

obrigado
09/09/2010 00:00


0
bom lucas, eles nao usam cluster não...

Após alguns testes aqui e contato com a faculdade, estou acreditando que é problema de cache.

Pois fizemos um teste outro dia, eles tiraram o cache em uma faculdade que estava ocorrendo o problema e corrigiu.

Eu estava pensando em gerar url diferente pra cada usuario, tipo passar no final da url alguma identificacao daquele usuario, pra que nao puxe mais cache por ser url diferente, tipo o post do kico pra atualizacao do css http://www.itexto.net/devkico/?p=763.

Valeu
16/09/2010 00:00


0
Bruto,

Como funciona esta questão do cache? Eles fazem o cache direto no apache com mod_cache?
Ou é cache da aplicação?

[]s,
16/09/2010 00:00


0
Olá,

Foi mal ae, criei outro topico do mesmo assunto.

E conforme outro topico, era cache mesmo, fiz um teste gerando um numero diferente no final do link para nao puxar do cache e funcionou.

Agora vou tentar usar o plugin q o lucas falow, e ver a questão do cache no firewall...

Obrigado a todos pela ajuda

Abraços
21/09/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto