Nosso aplicativo Django possui os seguintes requisitos de gerenciamento de sessão.
- As sessões expiram quando o usuário fecha o navegador.
- As sessões expiram após um período de inatividade.
- Detecta quando uma sessão expira devido à inatividade e exibe a mensagem apropriada para o usuário.
- Avise os usuários sobre a expiração de uma sessão iminente alguns minutos antes do final do período de inatividade. Junto com o aviso, forneça aos usuários a opção de estender sua sessão.
- Se o usuário estiver trabalhando em uma longa atividade de negócios dentro do aplicativo que não envolve o envio de solicitações ao servidor, a sessão não deve expirar.
Depois de ler a documentação, o código do Django e alguns posts de blog relacionados a isso, eu vim com a seguinte abordagem de implementação.
Requisito 1
Este requisito é facilmente implementado definindo SESSION_EXPIRE_AT_BROWSER_CLOSE como True.
Requisito 2
Eu vi algumas recomendações para usar SESSION_COOKIE_AGE para definir o período de expiração da sessão. Mas esse método tem os seguintes problemas.
A sessão sempre expira no final de SESSION_COOKIE_AGE, mesmo se o usuário estiver usando ativamente o aplicativo. (Isso pode ser evitado configurando a expiração da sessão para SESSION_COOKIE_AGE em cada solicitação usando um middleware personalizado ou salvando a sessão em cada solicitação configurando SESSION_SAVE_EVERY_REQUEST como verdadeiro. Mas o próximo problema é inevitável devido ao uso de SESSION_COOKIE_AGE.)
Devido à forma como os cookies funcionam, SESSION_EXPIRE_AT_BROWSER_CLOSE e SESSION_COOKIE_AGE são mutuamente exclusivos, ou seja, o cookie expira no fechamento do navegador ou no tempo de expiração especificado. Se SESSION_COOKIE_AGE for usado e o usuário fechar o navegador antes que o cookie expire, o cookie é retido e a reabertura do navegador permitirá que o usuário (ou qualquer outra pessoa) entre no sistema sem ser reautenticado.
Django confia apenas na presença do cookie para determinar se a sessão está ativa. Ele não verifica a data de expiração da sessão armazenada com a sessão.
O método a seguir pode ser usado para implementar esse requisito e solucionar os problemas mencionados acima.
- Não defina SESSION_COOKIE_AGE.
- Defina a data de expiração da sessão como 'hora atual + período de inatividade' em cada solicitação.
- Substitua process_request em SessionMiddleware e verifique a expiração da sessão. Descarte a sessão se ela tiver expirado.
Requisito 3
Quando detectamos que a sessão expirou (no SessionMiddleware personalizado acima), defina um atributo na solicitação para indicar a expiração da sessão. Este atributo pode ser usado para exibir uma mensagem apropriada para o usuário.
Requisito 4
Use JavaScript para detectar a inatividade do usuário, fornecer o aviso e também uma opção para estender a sessão. Se o usuário deseja estender, envie um pulso keep alive ao servidor para estender a sessão.
Requisito 5
Use JavaScript para detectar a atividade do usuário (durante a longa operação de negócios) e enviar pulsos de manutenção ao servidor para evitar que a sessão expire.
A abordagem de implementação acima parece muito elaborada e eu queria saber se poderia haver um método mais simples (especialmente para o Requisito 2).
Todos os insights serão muito apreciados.