gpt4 book ai didi

ruby-on-rails - Ruby on Rails 在不活动后设计超时重定向

转载 作者:行者123 更新时间:2023-12-03 16:01:48 24 4
gpt4 key购买 nike

我正在使用设计的超时功能,我有点困惑。如果用户的 session 超时,当他们刷新页面或执行涉及 Rails Controller 的操作(例如导航到站点内的另一个页面)时,他们将被重定向到登录页面。但是,由于我网站上的用户敏感信息,我想在超时发生后立即自动将用户发送到登录屏幕。有这样做的标准方法吗?

这是我的引用代码:https://stackoverflow.com/a/35464748/4714425

最佳答案

在@Sergio Tulentsev 的帮助下,我最终找到了我自己问题的答案,他在这个 Stack Overflow 答案的评论中给了我一些有用的信息:https://stackoverflow.com/a/14577951/4714425

基本上,Devise 的 Timeoutable 功能会默认每 30 分钟过期一次身份验证 token ...或者您可以在 中配置它配置/初始化器/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

问题

因为 Devise 在服务器端而不是客户端运行,所以当身份验证 token 超时时,客户端不会知道超时,直到用户执行调用 Rails Controller 的操作。这意味着用户在执行调用 Rails Controller 的操作之前不会在超时时重定向到登录页面。

就我而言,这是一个问题,因为我的网页包含用户敏感信息,如果用户忘记注销,我不想无限期地显示这些信息。

解决方案

我安装了 gem auto-session-timeout ,它将代码添加到客户端以定期检查身份验证 token 是否已过期。

依赖项

自述文件中没有说,但自动 session 超时需要 jquery-periodicalupdater为了工作。 This page包含原因:
auto-session-timeout periodicalupdater explanation

配置

以下是我为了让自动 session 超时与 Devise 一起工作而采取的步骤:
  • 首先,我按照步骤here为了自定义设计 session Controller 。仅供引用,我的配置/路由.rb 文件的设置方式如下:
    Myapp::Application.routes.draw do
    devise_for :users, controllers: { sessions: "users/sessions" }
    #other routes
    end
  • 应用程序/ Controller /用户/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
  • 应用程序/ Controller /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 将身份验证 token 到期时间设置为 30 分钟。这取代了设计超时功能。
  • 在我的应用程序中,我有两个布局模板 - 一个用于用户在登录时看到的所有页面( app/views/layouts/application.html.erb ),一个仅用于登录屏幕( app/views/layouts/login.html.erb )。在这两个文件中,我在 html <body> 中添加了以下行元素:
    <%= auto_session_timeout_js %>

    此代码将生成 Javascript,每 60 秒检查一次身份验证 token 的状态(此时间间隔是可配置的)。如果 token 超时,Javascript 代码将调用 timeout 中的方法应用程序/ Controller /用户/sessions_controller.rb 文件。

    请注意,我已将此代码包含在 中。应用程序/ View /布局/login.html.erb 页。原因是如果登录页面超过 30 分钟没有事件(或 auto_session_timeout 设置在 application_controller.rb 文件中),则身份验证 token 将过期,并且用户在尝试登录时将收到 Invalid Authentication Token 错误。添加代码 <%= auto_session_timeout_js %>将导致身份验证 token 过期时刷新登录,从而防止发生此错误。
  • 关于ruby-on-rails - Ruby on Rails 在不活动后设计超时重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36358990/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com