Pergunta

Ao criar um aplicativo da web, e digamos que você tenha um objeto User denotando um único usuário, qual você acha que é a melhor maneira de armazenar que o usuário efetuou login?

Duas maneiras que pensei foram:

  • Armazenou o ID do banco de dados do usuário em uma variável de sessão
  • Armazenou todo o objeto de usuário em uma variável de sessão

Alguma sugestão melhor, algum problema ao usar as formas acima?Talvez problemas de segurança ou problemas de memória, etc., etc.

Foi útil?

Solução

Eu recomendo armazenar o id em vez do objeto.A desvantagem é que você precisa acessar o banco de dados toda vez que quiser obter as informações desse usuário.No entanto, a menos que cada milissegundo conte na sua página, o desempenho não deve ser um problema.Aqui estão duas vantagens:

  1. Se as informações do usuário mudarem de alguma forma, você não armazenará informações desatualizadas em sua sessão.Por exemplo, se um usuário receber privilégios extras de um administrador, eles estarão imediatamente disponíveis sem que o usuário precise sair e fazer login novamente.

  2. Se as informações da sua sessão estiverem armazenadas no disco rígido, você só poderá armazenar dados serializáveis.Portanto, se o seu objeto User contiver algo como uma conexão de banco de dados, soquete aberto, descritor de arquivo, etc., isso não será armazenado corretamente e também poderá não ser limpo adequadamente.

Na maioria dos casos, essas preocupações não serão um problema e qualquer abordagem seria adequada.

Outras dicas

Por questões de segurança, eu geraria (um GUID ou um RNG criptograficamente seguro) um ID de sessão e teria uma tabela que apenas mapeia IDs de sessão para IDs de usuário.Em seguida, basta armazenar o ID da sessão nos cookies e fazer com que ele atue como um proxy para o ID do usuário.

|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|

Com isso, ninguém pode se passar por outro usuário adivinhando seu ID.Também permite limitar as sessões dos usuários para que eles tenham que fazer login de vez em quando (duas semanas é o normal).E se você quiser armazenar outros dados sobre a sessão deles, basta adicioná-los a esta tabela.

Apenas lembre-se de que se você armazenar todos os atributos do usuário (isso se estende às permissões) na sessão, quaisquer alterações no usuário não terão efeito até que ele faça login novamente.

Pessoalmente, guardo o nome e o ID para referência rápida e busco o restante quando preciso.

Armazenar o ID é a prática recomendada na maioria dos casos.Uma razão importante para isso é a escalabilidade.Se você armazenar o objeto de usuário (ou qualquer entidade do banco de dados, em vez de apenas seus IDs), terá problemas ao expandir o número de servidores que atendem seu site.Para obter mais informações, pesquise no Google "arquitetura de nada compartilhada".

Acho que depende de qual plataforma você está usando.Se você estiver usando ASP.net, eu definitivamente daria uma olhada no Autenticação de Formulários class e todas as funcionalidades integradas (e extensíveis) que você pode usar para armazenar as configurações do usuário conectado.

Eu armazenaria um valor hash do ID do usuário e do ID da sessão e, em seguida, combinaria isso em uma tabela de sessões no banco de dados.Dessa forma, será mais difícil falsificar os dados da sessão.Poderia verificar o IP também como uma verificação extra.

Não tenho certeza se gostaria de contar com um ID de usuário armazenado em uma variável de sessão e confiar que era esse usuário, pois ele poderia ser alterado com bastante facilidade e obter acesso como outro membro

Eu armazeno o usuário na sessão, normalmente.O problema de login que não pode ser alterado até pode ser resolvido substituindo o objeto na sessão por uma nova cópia depois de fazer as alterações.

Nosso objeto de usuário é bastante leve, então optamos por armazená-lo em uma variável de sessão.Não tenho certeza se isso é mais eficiente, mas até agora está funcionando muito bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top