Подтвердить что ты не робот

Автоматический выход из системы после бездействия/бездействия

Как настроить в приложении rails, что если любой пользователь простаивает в течение 30 минут или определенного периода времени, он должен автоматически выйти из системы. Может ли кто-нибудь дать какое-либо решение. Я использую устройство для проверки подлинности. Любая помощь приветствуется.

4b9b3361

Ответ 1

Вы должны использовать Timeoutable модель.

Timeoutable заботится о том, действительно ли уже закончился сеанс пользователя или нет. Когда сеанс истекает после настроенного времени, пользователю снова будут предложены учетные данные, это означает, что он будет перенаправлен на страницу входа.

Функции

Timeoutable добавляет следующие параметры devise_for:

  • + timeout_in +: интервал времени ожидания сеанса пользователя без активности.

В вашей модели вам нужно

devise :timeoutable
# along with :database_authenticatable, :registerable and other things.

Кроме того, посмотрите config/initializers/devise.rb, вы можете настроить там время ожидания.

Ответ 2

Я знаю, что на этот вопрос уже был дан ответ, но я подумал, что также предлагаю свое решение, так как в моем случае я искал больше функциональности, чем может предоставить функция Time Time. Большое спасибо @Sergio Tulentsev за предоставление мне полезных объяснений и идей в разделе комментариев его ответа!

Проблема

Поскольку Devise работает на стороне сервера, а не на стороне клиента, когда токен аутентификации истекает, клиент не знает о тайм-ауте, пока пользователь не выполнит действие, которое вызывает контроллер Rails. Это означает, что пользователь не перенаправляется на страницу входа в систему с таймаутом до тех пор, пока не выполнит действие, вызывающее контроллер Rails.

В моем случае это было проблемой, потому что моя веб-страница содержала конфиденциальную информацию, которую я не хотел показывать неопределенно, если пользователь забыл выйти и никаких действий не было выполнено на странице.

Решение

Я установил gem auto-session-timeout, который добавляет код на клиентскую сторону, чтобы периодически проверять, прошел ли токен аутентификации.

Зависимости

Он не говорит в ReadMe, но для работы в режиме автоматического сеанса требуется jquery-periodicalupdater. Эта страница содержит причину: auto-session-timeout periodicalupdater explain

Конфигурация

Вот шаги, которые я предпринял для того, чтобы получить автоматическое время ожидания сеанса для работы с Devise:

  • Прежде всего, я выполнил шаги здесь, чтобы настроить контроллеры сеансов разработки. Для справки мой файл config/routes.rb настроен следующим образом:

    Myapp::Application.routes.draw do
      devise_for :users, controllers: { sessions: "users/sessions" }
      #other routes
    end
    
  • В приложении/контроллерах/users/sessions_controller.rb у меня есть следующий код:

    class Users::SessionsController < Devise::SessionsController
      layout 'login' #specifies that the template app/views/layouts/login.html.erb should be used instead of app/views/layouts/application.html.erb for the login page
    
      #configure auto_session_timeout
      def active
        render_session_status
      end
    
      def timeout
        flash[:notice] = "Your session has timed out."
        redirect_to "/users/sign_in"
      end
    end
    
  • В приложении/контроллерах/application_controller.rb у меня есть следующий код:

    class ApplicationController < ActionController::Base
      # Prevent CSRF attacks by raising an exception.
      # For APIs, you may want to use :null_session instead.
      protect_from_forgery with: :exception
      before_action :authenticate_user!
      auto_session_timeout 30.minutes
    
    end
    

    Обратите внимание, что мы установили время истечения срока действия токена аутентификации 30 минут, используя auto_session_timeout. Это заменяет функциональность тайм-аута Devise.

  • В моем приложении у меня есть два шаблона макета: один для всех страниц, которые пользователь видит при входе в систему (app/views/layouts/application.html.erb) и один для экрана входа в систему ( app/views/layouts/login.html.erb). В обоих этих файлах я добавил строку ниже в элемент html <body>:

    <%= auto_session_timeout_js %>
    

    Этот код будет генерировать Javascript, который проверяет статус токена аутентификации каждые 60 секунд (этот интервал времени настраивается). Если токен истекло, код Javascript вызывает метод timeout в файле app/controllers/users/sessions_controller.rb.

    Обратите внимание, что я включил этот код на страницу app/views/layouts/login.html.erb. Причина этого заключается в том, что, если на странице входа в систему больше 30 минут нет активности (или что бы то ни было, параметр auto_session_timeout находится в файле application_controller.rb), то токен аутентификации истекает, и при попытке входа в систему пользователь получит недопустимую ошибку токена аутентификации. Добавление кода <%= auto_session_timeout_js %> приведет к обновлению имени входа при истечении срока действия маркера аутентификации, что предотвратит появление этой ошибки.

Ответ 3

Использование Devise Gem:

Мы можем использовать встроенную функцию созданного gem, но он не будет автоматически перенаправляться на страницу входа в систему после таймаута, перенаправление будет выполнено после выполнения любого действия.

Мы можем выполнить автоматическое выключение:

Используя gem "auto-session-timeout"

https://github.com/pelargir/auto-session-timeout

Недостаток использования этого драгоценного камня заключается в том, что он автоматически выйдет из системы, если пользователь только печатает (выполняет событие нажатия клавиши) до тайм-аута.

мы можем отменить недостаток, используя Javascript:

Шаг 1: Определите маршруты

get 'application/session_time'

Шаг 2: JavaScript будет содержать

$(document).ready(function(){
if($("#user_logged").is(":visible") == true )
{
    $(document).on( "keypress keydown", function () {
        console.log("hello");
        $.ajax({
            type:"GET",
            url:"/application/session_time",
            dataType:"html",
        });
    });
}
});

Шаг 3: контроллер приложения будет содержать:

@session_time = 5.minute
auto_session_timeout @session_time
def session_time
  @session_time = 5.minute
end

Шаг 4: div, чтобы найти его на странице входа или нет

<% if user_signed_in? %>
  <div id="user_logged"></div>
<% end %>

Чистый div сохраняется, потому что мы должны загружать JavaScript только тогда, когда пользователь вошел в систему, поэтому вместо поиска текущего пользователя нет или нет.

Я сделал с пустым div, он будет доступен, если пользователь зарегистрирован, поэтому в начале JavaScript он проверяется, присутствует ли div_id "user_loged" или нет.