Você está na página 1de 29

Controle de Sessão de

Usuário

Prof. Fellipe Aleixo (fellipe.aleixo@ifrn.edu.br)


Sessões
• O protocolo HTTP não guarda “estado”
§ Não provê nenhuma forma de identificar acessos
simultâneos de um mesmo usuário
§ Como então possibilitar que um usuário faça o login na
aplicação e realize uma série de tarefas?

• Solução: controle de sessões


§ Permite que sejam armazenadas informações relativas a
um dado usuário (IP, nome de usuário, navegador, etc.)
Como Utilizar Sessões
• Django provê uma infraestrutura para armazenar e
recuperar informações de usuários específicos
§ Armazena dados no servidor
§ Abstrai o envio e recebimento de Cookies
§ Uma das informações trocadas é o ID da sessão
Habilitando Sessões
• Controle de sessão faz parte do middleware Django
• Para habilitar:
§ Editar a sessão MIDDLEWARE do arquivo de configuração
(settings.py) para incluir
§ django.contrib.sessions.middleware.SessionMiddleware
§ Padrão para projetos criados por startproject
• Para remover:
§ Desativar o middleware acima e
§ Remover “django.contrib.sessions” de INSTALLED_APPS
Configurando as Sessões
• Por padrão, o Django utiliza banco de dados para
armazenar os dados de sessão, através do model
django.contrib.sessions.models.Session
§ Forma “segura” de armazenar dados
§ Não tão performática como outras opções

• Para utilizar sessões armazenadas em banco:


§ Adicionar django.contrib.sessions em INSTALLED_APPS
§ Executar as migrações para que sejam criadas as tabelas
de banco de dados correspondentes
Outras Opções
1. Armazenamento baseado em cache
§ Utiliza a memória do servidor
§ Melhor performance (utilizando só memória)
§ Pode ser configurada para ser persistente (em banco)

2. Armazenamento baseado em arquivos


§ Solução com persistência “simples”

3. Armazenamento baseado em cookies


§ Os dados da sessão são armazenados de forma
criptografada (com chave secreta)
Utilizando Sessões nas Views
• Com o SessionMiddleware ativado, cada objeto
HttpRequest possui um atributo session (dicionário)
§ Forma de acesso: request.session
§ Pode ser utilizado para armazenar e recuperar dados
• Métodos:
§ __getitem__(key)
fav_color = request.session['fav_color']

§ __setitem__(key, value)
request.session['fav_color'] = 'blue'
Utilizando Sessões nas Views
• Mais métodos:
§ __delitem__(key)
del request.session['fav_color']

o Retorna KeyError se a chave não estiver na sessão


§ __contains__(key)
'fav_color' in request.session

§ get(key, default=None)
fav_color = request.session.get('fav_color', 'red')
Utilizando Sessões nas Views
• Mais métodos:
§ pop(key, default=__not_given)
fav_color = request.session.pop('fav_color', 'blue')

§ keys()
§ items()
§ setdefault()
§ clear()
§ flush()
o Remove os dados da sessão corrente, bem como o cookie da sessão
o Ex.: quando executado django.contrib.auth.logout()
Utilizando Sessões nas Views
• Mais métodos:
§ set_test_cookie()
o Define um teste se o navegador do usuário suporta cookies
o Só poderá ser verificado o resultado na próxima requisição do usuário
§ test_cookie_worked()
o Retorna True ou False com o resultado do suporte à cookies
§ delete_test_cookie()
o Desliga o teste de cookies
§ set_expiry(value)
o Define um tempo para a expiração da sessão
o O valor (inteiro) indica o tempo máximo de inatividade, em segundos
o Ex.: request.session.set_expiry(300) leva a sessão expirar em 5 minutos
o Se o valor for 0, o cookie de sessão irá expirar quando o navegador fechar
o Se o valor for None, será utilizada a política “global”
Utilizando Sessões nas Views
• Mais métodos:
§ get_expiry_age()
o Retorna o número de segundos até a sessão expirar
o Aceita dois argumentos opcionais – modification e expiry
o Modification como a última modificação na sessão, na forma de datetime
o Expiry como um objeto datetime com as informações de expiração
§ get_expiry_date()
o Retorna uma data precisa em que a sessão irá expirar
o Aceita os mesmos argumentos que get_expiry_age()
§ get_expire_at_browser_close()
o Retorna True ou False caso o cookie de sessão irá expirar quando o
navegador do usuário for fechado
Utilizando Sessões nas Views
• Mais métodos:
§ clear_expired()
o Remove os dados das sessões expiradas do armazenamento utilizado
o Método invocado pelo clearsessions, o qual é executado periodicamente
pelo framework Django
§ cycle_key()
o Cria uma nova chave de sessão, mantendo os dados da sessão atual.
o Esse método é invocado no processo de login de usuário
django.contrib.auth.login()
Serialização de Sessões
• Por padrão, o Django serializa os dados das sessões
utilizando o padrão JSON

• Pode ser usada a configuração SESSION_SERIALIZER


para customizar o formato de serialização

• É desaconselhada a utilização de outro método


Manipulação de Dados em Sessão
• Algumas regras gerais:
§ Use cadeias de caracteres Python “normais” como chaves
de dicionário em request.session
§ As chaves do dicionário de sessão que começam com um
sublinhado são reservadas para uso interno pelo Django
§ Não substitua request.session por um novo objeto e não
acesse ou defina seus atributos, use-o como um
dicionário Python

• Serão utilizados exemplos de código para ilustrar


Manipulação de Dados em Sessão
• Exemplo 1: define a variável has_commented como
True após o usuário postar um comentário
Manipulação de Dados em Sessão
• Exemplo 2: procede o login de um “membro”
Manipulação de Dados em Sessão
• Exemplo 3: procedo o logout de um “membro”
Definindo o Teste de Cookies
• Django provê uma forma simples de testar se o
navegador utilizado por um usuário aceita cookies

• (1º) método set_test_cookie() de request.session

• (2º) método test_cookie_worked() em uma view


subsequente

• (3º) método delete_test_cookie(), após a


verificação
Definindo o Teste de Cookies
• Exemplo:
Usando Sessões fora das Views
• A API permite manipular sessões fora de Views
• Exemplo:
Usando Sessões fora das Views
• SessionStore.create() – cria uma nova sessão

• save() – salva um objeto sessão, mas pode gerar


uma “chave de sessão” igual a uma já existente

• create() – chama o método save(), mas garante a


alocação de uma “chave de sessão” não utilizada
Usando Sessões fora das Views
• No armazenamento das sessões em banco de dados
– django.contrib.sessions.backends.db – cada
sessão é representada por uma classe de modelo
• Classe definida em
django/contrib/sessions/models.py
Usando Sessões fora das Views
• Para acessar os dados armazenados no dicionário
da sessão, é necessário o método get_decoded()
§ Pois os dados são armazenados codificados
Quando as Sessões são Armazenadas
• Por padrão, Django apenas armazena as sessões no
banco quando estas são modificadas
Sessões Finalizadas pelo Fechamento
do Navegador do Usuário
• Configurado pelo parâmetro
SESSION_EXPIRE_AT_BROWSER_CLOSE
§ Que por padrão é False
§ Nesse caso, a sessão permanecerá ativa até atingir a
SESSION_COOKIE_AGE
§ Caso seja definido como True, os cookies de sessão
permanecerão ativos até o fechamento do navegador
§ Essa definição atua como padrão global, que pode ser
alterado pela invocação do set_expiry()
Liberando a Área de Armazenamento
• A medida que são criadas novas sessões os dados
vão se acumulando na área de armazenamento
§ P.ex.: usuários fazem login, mas não fazem logout
§ No caso de utilização de banco de dados, a tabela
django_session pode crescer sem controle
Liberando a Área de Armazenamento
• Django não provê nenhuma forma automática de
eliminação dos dados das sessões encerradas
§ Fica a cargo do desenvolvedor/administrador

• Django provê um comando para tal limpeza –


clearsessions – devendo ser executado diariamente
(disparado pela cron)
Segurança de Sessões
• Subdomínio de um site podem definir cookies no
cliente para todo o domínio
§ Isso torna o sequestro de sessões possível, caso existam
subdomínios controlados por usuários não confiáveis
§ Um hacker com controle de bad.example.com, pode usar
o mesmo para enviar uma chave de sessão para o
domínio *.example.com
§ Ao acessar good.example.com pode estar logado e ter
acesso a informações que não poderia
Mais Informações
• Configurações possíveis:
https://docs.djangoproject.com/pt-
br/2.2/ref/settings/#settings-sessions

• Documentação oficial:
https://docs.djangoproject.com/pt-
br/2.2/topics/http/sessions/

Você também pode gostar