如何设置在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为了工作。 此页面包含了原因:
组态
下面是我为了得到自动会话超时与设计工作的步骤:
首先,我跟着步骤这里 ,以定制设计的会话控制器。 仅供参考,我的config / routes.rb中文件是建立在以下方式:
Myapp::Application.routes.draw do devise_for :users, controllers: { sessions: "users/sessions" } #other routes end
在应用程序/控制器/用户/ 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
请注意,我们设置了身份验证令牌到期时间是使用auto_session_timeout 30分钟。 这取代了设计timeoutable功能。
在我的应用程序,我有两个布局模板-一个用于所有,当他们在( 应用程序/视图/布局/ application.html.erb)登录用户看到的页面,以及一个只为登录屏幕( 应用程序/意见/layouts/login.html.erb)。 在这两个文件,我添加的HTML内下方的线
<body>
元素:<%= auto_session_timeout_js %>
此代码将生成的Javascript来检查该认证每隔60秒令牌(该时间间隔是可配置的)的状态。 如果令牌已经超时,Javascript代码会调用
timeout
在app /控制器/用户/ 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”存在或不存在。