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

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

19
nl ja de
добавлено автор tostao, источник

3 ответы

Вы должны использовать Timeoutable модельный признак ,

Timeoutable takes care of veryfing whether a user session has already expired or not. When a session expires after the configured time, the user will be asked for credentials again, it means, he/she will be redirected to the sign in page.

Options

Timeoutable adds the following options to devise_for:

  • +timeout_in+: the interval to timeout the user session without activity.

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

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

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

24
добавлено
@ alex0112: как хочешь :)
добавлено автор Sergio Tulentsev, источник
@ kales33: ну да, после того, как пользователь загрузил страницу, вы не можете повлиять на нее с сервера. Первое, что приходит на ум - это опрос с помощью javascript, но это, вероятно, продлит тайм-аут на неопределенный срок. Как насчет тега метаобработки с некоторым большим значением (равным таймауту вашего устройства установка)?
добавлено автор Sergio Tulentsev, источник
Спасибо за ответ, но мне также нужно показать предупреждающее сообщение о том, что пользователь простаивает в течение такого периода времени, любезно контролируйте свою деятельность непосредственно перед тем, как вывести его из приложения.
добавлено автор Samar Kr Mishra, источник
@SergioTulentsev Спасибо за объяснение и за идею! Я все посмотрел только на объяснения, которые вы мне дали, и я не мог найти его. Так что спасибо тебе!
добавлено автор kales33, источник
Проблема, с которой я столкнулась с Timeoutable, заключается в том, что она не автоматически регистрирует пользователя. То есть пользователь должен выполнить действие перед тем, как Devise проверяет, все ли пользователь вошел в систему. Например, если пользователь отключится, они все равно будут видеть текущую страницу до тех пор, пока они не обновят страницу или не предпримут действие, которое попадет в Rails контроллер. Есть ли способ обойти это? У меня есть пользовательская информация, которую я не хочу показывать на странице неограниченно, пока пользователь не повторит действие.
добавлено автор kales33, источник
Brilliant. Спасибо. знак равно
добавлено автор 0112, источник
Я бы дал ответ на этот ответ, если бы он сказал мне, где этот код идет, и дайте мне пример того, как он выглядит. знак равно
добавлено автор 0112, источник

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

проблема

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

In my case, this was a проблема because my web page contained user-sensitive information that I did not want displayed indefinitely if the user forgot to logout and no action was performed on the page.

Решение

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

зависимости

It doesn't say in the ReadMe, but auto-session-timeout requires jquery-periodicalupdater in order to work. This page contains the reason why: auto-session-timeout periodicalupdater explanation

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

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

  1. First of all, I followed the steps here in order to customize the Devise sessions controllers. Just for reference, my config/routes.rb file is set up in the following way:

    Myapp::Application.routes.draw do
      devise_for :users, controllers: { sessions: "users/sessions" }
      #other routes
    end
    
  2. In app/controllers/users/sessions_controller.rb, I have the following code:

    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
    
  3. In app/controllers/application_controller.rb, I have the following code:

    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
    

    Note that we set the authentication token expiration time to be 30 minutes using auto_session_timeout. This replaces the Devise timeoutable functionality.

  4. In my app, I have two layout templates - one for the all the pages that the user sees when they are logged in (app/views/layouts/application.html.erb), and one just for the login screen (app/views/layouts/login.html.erb). In both of these files, I added the line below within the html <body> element:

    <%= auto_session_timeout_js %>
    

    This code will generate Javascript that checks the status of the authentication token every 60 seconds (this time interval is configurable). If the token has timed out, the Javascript code will call the timeout method in the app/controllers/users/sessions_controller.rb file.

    Note that I have included this code on the app/views/layouts/login.html.erb page. The reason for this is because if there is no activity on the login page for more than 30 minutes (or whatever the auto_session_timeout setting is in the application_controller.rb file), then the authentication token will expire, and the user will receive an Invalid Authentication Token error when trying to login. Adding the code <%= auto_session_timeout_js %> will cause the login to be refreshed when the authentication token expires, thus preventing this error from occurring.

9
добавлено
Драгоценный камень работает как шарм! благодаря! Но есть ли способ получить и обновить пользователя до того, как пользователь будет перенаправлен на страницу входа в действие timeout ?
добавлено автор Vishal, источник
Это единственный рабочий тайм-аут JavaScript с дизайном? Старался придумать свой собственный пинг, но это поддерживало связь.
добавлено автор grimmwerks, источник
Пробовал это по проекту рельсов 5. Этот жемчуг не работает в рельсах 5.
добавлено автор joeyk16, источник
Ницца...! Это было задано давно и уже разрешено, хотя ваш ответ довольно приятен и для тайм-аута сеанса на стороне клиента. +1
добавлено автор Samar Kr Mishra, источник
Что делать, если пользователь закрывает браузер или выключает компьютер?
добавлено автор Faizan, источник
@ joeyk16 у вас есть обновление относительно рельсов 5? благодаря
добавлено автор dowi, источник
@Faizan При использовании функции auto-session-timeout gem используется cookie _myapp_session для отслеживания сеанса пользователя. Всякий раз, когда файл cookie истекает или очищается, сеанс больше не действует. Что касается истечения срока действия файла cookie, время истечения срока указывается в файле application_controller.rb. Что касается очищаемого файла cookie, это зависит от настроек вашего браузера. Файл cookie настроен на очистку при завершении сеанса просмотра. Из того, что я прочитал, для каждого браузера это отличается. Для некоторых примеров см. stackoverflow.com/a/36421888/4714425 .
добавлено автор kales33, источник
@Faizan Последнее примечание (это не соответствовало моему последнему комментарию) ... Сеанс просмотра, безусловно, закончится, когда компьютер выключится.
добавлено автор kales33, источник
@dowi, joeyk16 Я не использовал этот камень/стратегию с Rails 5. По моему мнению, произошли значительные изменения от Rails 4 до Rails 5, поэтому меня не удивляет, что этот камень не работает в Rails 5. I Извините, но из-за моей неопытности с Rails 5 я не знаю об обходном пути.
добавлено автор kales33, источник
@grimmwerks Это был единственный, который я смог найти в то время, когда я работал над этим проектом
добавлено автор kales33, источник

Using Devise Gem:

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

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

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

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

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

we can override the disadvantage by using Javascript:

Step 1: Define the routes

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» или нет.

4
добавлено
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff