Devise Automatic Logout
By Thadeu Esteves Jr.
Provê um logout automático da sessão numa aplicação Rails utilizando Devise. É simples e fácil. Faz com que a sessão seja destruída após a conclusão do tempo estipulado. É de grande ajuda em sistemas que necessitam de sessão auto destrutiva, evitando de o usuário ficar logado por muito tempo de forma ociosa.
O que isso faz?
- Força o usuário a sair da sessão (logout)
- Opção de mostrar um timer regressivo
- Opção de dar um alerta na tela ao ser deslogado
Começando
Adicione ao seu Gemfile
gem 'devise-automaticlogout', '~> 1.0.2'
Rode o bundle install
Configure o controller
No controller que você deseja aplicar o timer para o devise, use:
devise_automatic_logout
Por exemplo, para o comum ApplicationController, poderia ser
class ApplicationController < ActionController::Base
devise_automatic_logout
end
Isso por si só, já prepara a aplicação para ler os dados do Devise#timeout_in
, utilizando o scope padrão user
e uma mensagem padrão de alerta.
Mas se você quiser, configurar um tempo diferente do timeout_in do devise? Fácil, use o seguinte:
devise_automatic_logout time: 1.hour.to_i
Isso vai aplicar 1 hora para o logout automático.
Mas e se você quiser colocar outra mensagem? Fácil, use o seguinte:
devise_automatic_logout time: 1.hour.to_i, message: 'SUA MENSAGEM'
Mas e se você quiser fazer, com que seja utilizado outro tipo de mapping do devise? Fácil, use o seguinte:
devise_automatic_logout scope: 'member'
É possível também utilizar todos de uma vez só, por exemplo
devise_automatic_logout time: 15.minutes.to_i, message: 'Sua sessão expirou! Faça login novamente.', scope: 'member'
OBS: Quando o time
não é passado, o timeout_in do devise será aplicado, se configurado, é claro!
Configurando Timeoutable
Veja na documentação do próprio devise como fazer isso.
Mais informações sobre Timeoutable
Configurando o timer regressivo (OBRIGATÓRIO)
Esse helper deve ser usado em qualquer view, ele é importante, pois tudo será baseado nele
<%= regressive_timer visible: true, alert: true %>
- visible: mostra um timer regressivo
- alert: lança um
window.alert
se ativado, ao final do timer
E se você quiser, que uma determinada action
ou um controller
todo, não execute o timer? É fácil também, olha só.
class DashboardController < ApplicationController
prepend_before_action { request.env['devise.skip_timeout'] = true }
def index; end
end
Se quiser saber mais sobre isso, acesse a Wiki do Devise
Configurando Javascript
Adicione no seu application.js, o seguinte:
//= require automatic_logout
Se você usa vanilla js, adicionar também o seguinte:
//= require automatic_logout/classic
Se você usa jQuery, use:
//= require automatic_logout/jquery
Se você usa Turbolinks mais atual, use:
//= require automatic_logout/turbolinks
Se você usa Turbolinks mais antigo, use:
//= require automatic_logout/turbolinks-classic
Se preferir, use manualmente em algum momento desejado
AutomaticLogout.load();
Contributing
We have a long list of valued contributors. Check them all at: https://github.com/Thadeu/devise-automaticlogout.