kal*_*s33 4 ruby-on-rails session-timeout devise
我正在使用Devise的Timeoutable功能,我有点困惑.如果用户的会话超时,则在刷新页面或执行涉及Rails控制器的操作(例如,导航到站点内的其他页面)时,会将其重定向到登录页面.但是,由于我网站上的用户敏感信息,我想在超时发生后立即自动将用户发送到登录屏幕.有这样做的标准方法吗?
kal*_*s33 12
在@Sergio Tulentsev的帮助下,我最终找到了自己问题的答案,他在Stack Overflow答案的评论中给了我一些有用的信息:https://stackoverflow.com/a/14577951/4714425
基本上,Devise的Timeoutable功能默认情况下每隔30分钟就会使身份验证令牌过期...或者您可以在config/intializers/devise.rb中将其配置为您想要的任何时间:
# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
config.timeout_in = 30.minutes
Run Code Online (Sandbox Code Playgroud)
因为Devise在服务器端运行而不是在客户端运行,所以当身份验证令牌超时时,客户端不会知道超时,直到用户执行调用Rails控制器的操作.这意味着在执行调用Rails控制器的操作之前,用户不会在超时时重定向到登录页面.
在我的情况下,这是一个问题,因为我的网页包含用户敏感信息,如果用户忘记注销,我不想无限期地显示这些信息.
我安装了gem auto-session-timeout,它将代码添加到客户端,以定期检查身份验证令牌是否已过期.
它没有在自述文件中说,但自动会话超时需要jquery-periodicalupdater才能工作. 此页面包含以下原因:

以下是为了使自动会话超时与Devise一起使用而采取的步骤:
首先,我按照这里的步骤来自定义Devise会话控制器.仅供参考,我的config/routes.rb文件按以下方式设置:
Myapp::Application.routes.draw do
devise_for :users, controllers: { sessions: "users/sessions" }
#other routes
end
Run Code Online (Sandbox Code Playgroud)在app/controllers/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
Run Code Online (Sandbox Code Playgroud)在app/controllers/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
Run Code Online (Sandbox Code Playgroud)
请注意,我们使用auto_session_timeout将身份验证令牌到期时间设置为30分钟.这取代了Devise超时功能.
在我的应用程序,我有两个布局模板-一个用于所有,当他们在(登录用户看到网页应用程序/视图/布局/ application.html.erb),和一个只为登录屏幕(应用程序/意见/layouts/login.html.erb).在这两个文件中,我在html <body>元素中添加了以下行:
<%= auto_session_timeout_js %>
Run Code Online (Sandbox Code Playgroud)
此代码将生成Javascript,每隔60秒检查一次身份验证令牌的状态(此时间间隔是可配置的).如果令牌已经超时,Javascript代码会调用timeout该方法的应用程序/控制器/用户/ sessions_controller.rb文件.
请注意,我已将此代码包含在app/views/layouts/login.html.erb页面中.这样做的原因是,如果登录页面上没有活动超过30分钟(或者application_controller.rb文件auto_session_timeout中的任何设置),则身份验证令牌将过期,并且用户将收到无效的身份验证令牌尝试登录时出错.添加代码将导致在身份验证令牌到期时刷新登录,从而防止发生此错误.<%= auto_session_timeout_js %>
| 归档时间: |
|
| 查看次数: |
3184 次 |
| 最近记录: |