不活动/空闲后自动注销(automatic logout after inactivity/idle

2019-07-18 21:44发布

如何设置在Rails应用程序,如果任何用户闲置30分钟或一个特定的时间段,他应该自动被注销。 任何人能给出任何解决方案。 我使用的设计进行验证的目的。 任何帮助表示赞赏。

Answer 1:

您应该使用Timeoutable模型特质。

Timeoutable需要veryfing用户会话是否已经过期或不照顾。 当配置的时间后会话过期后,用户将被要求提供凭据再次,这意味着,他/她将被重定向到登录页面。

选项

Timeoutable添加以下选项devise_for:

  • + timeout_in +:间隔超时的用户会话,而不活动。

在模型中,你需要

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

另外,看看config/initializers/devise.rb ,你可以在那里配置超时值。



Answer 2:

我知道这个问题已经回答了,但我想我会提供我的解决方案为好,因为在我的情况我一直在寻找,甚至比设计的timeoutable功能可提供更多的功能。 非常感谢@Sergio Tulentsev为我提供在他的回答的评论部分有帮助的解释和想法!

问题

由于设计在服务器端,而不是客户端,用完的认证令牌时间,直到用户执行调用Rails控制器的操作客户端时不知道超时。 这意味着,直到他们执行调用Rails控制器的操作的用户不重定向到超时登录页面。

在我的情况,这是因为我的网页载有我不想无限期地如果用户忘记了注销,并在页面上没有执行动作显示用户敏感信息的问题。

我安装了宝石自动会话超时 ,为其添加代码到客户端定期检查身份验证令牌已过期。

依赖

它不会在自述说,但自动会话超时需要jQuery的periodicalupdater为了工作。 此页面包含了原因:

组态

下面是我为了得到自动会话超时与设计工作的步骤:

  1. 首先,我跟着步骤这里 ,以定制设计的会话控制器。 仅供参考,我的config / routes.rb中文件是建立在以下方式:

     Myapp::Application.routes.draw do devise_for :users, controllers: { sessions: "users/sessions" } #other routes end 
  2. 应用程序/控制器/用户/ 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 
  3. 应用程序/控制器/ 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 

    请注意,我们设置了身份验证令牌到期时间是使用auto_session_timeout 30分钟。 这取代了设计timeoutable功能。

  4. 在我的应用程序,我有两个布局模板-一个用于所有,当他们在( 应用程序/视图/布局/ application.html.erb)登录用户看到的页面,以及一个只为登录屏幕( 应用程序/意见/layouts/login.html.erb)。 在这两个文件,我添加的HTML内下方的线<body>元素:

     <%= auto_session_timeout_js %> 

    此代码将生成的Javascript来检查该认证每隔60秒令牌(该时间间隔是可配置的)的状态。 如果令牌已经超时,Javascript代码会调用timeoutapp /控制器/用户/ sessions_controller.rb文件的方法。

    请注意,我已经包括了应用程序/视图/布局/ login.html.erb网页上的代码。 这样做的原因是因为如果超过30分钟(或任何登录页面上没有任何活动auto_session_timeout设置在application_controller.rb文件),然后验证令牌将到期,并且用户将收到一个无效的认证试图登录时令牌错误。 在添加代码<%= auto_session_timeout_js %>将导致当认证令牌过期,因此防止出现这种错误被刷新的登录。



Answer 3:

使用设计宝石:

我们可以用色器件宝石的内置功能,但它不会自动重定向到登录页面超时后,重定向会后,我们执行任何操作来完成。

我们可以自动执行登出:

通过使用宝石“自动会话超时”

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 %>

空白格保持,因为我们需要加载JavaScript的,只有当用户登录,所以不是寻找当前用户是零或不是。

我曾与空白格完成,这将是可用的,如果用户的loggedIn,所以在JavaScript中的开始检查出div_id“user_loged”存在或不存在。



文章来源: automatic logout after inactivity/idle