【问题标题】:Rails/Devise - how to logout a user after an `x` minutes of inactivity?Rails/Devise - 如何在“x”分钟不活动后注销用户?
【发布时间】:2017-05-11 15:16:24
【问题描述】:

我正在开发一个包含许多角色的系统,其中一个角色是ADMIN,它可以访问系统的关键部分,我想限制用户的会话,当他/她不与系统交互时一段时间后,它的会话到期,下次他/她应该重新登录,我该怎么做?

【问题讨论】:

    标签: ruby-on-rails session devise ruby-on-rails-5


    【解决方案1】:

    Devise 有一个您可以使用的 timeoutable 模块。

    在您的User 模型中,您可以将:timeoutable 包含在您的devise 模型中,并且在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 = ENV['YOUR_TIME'].to_i.minutes
    

    如果您想更灵活地处理用户类型,可以为 User 模型添加类似这样的方法:

    def timeout_in
      if self.type == 'Admin'
        45.minutes
      else
        60.minutes
      end
    end
    

    这将被用来代替在你的初始化程序中设置timeout_in

    【讨论】:

    • 或者 ENV.fetch('YOUR_TIME', 5).to_i.minutes 如果你想要一个默认值而不是得到一个神秘的 NoMethodError
    • 不错的方法,但我所有的角色都由User 模型总结,不同的type_id;虽然我提出了另一个解决方案gem 'activerecord-session_store' 来使用户会话超时,但要接受您的回答,有没有办法让您的解决方案仅针对不同的用户类型动态?
    • @dariush 我更新了答案,希望能完整回答您的问题
    • @dariush 请看精品手册中的timedout?方法。
    • @dariush 这只会在一段时间不活动后退出会话。请参阅timeoutable.rb 的此评论“每次设置记录时,我们都会检查其会话是否已经超时,基于上次请求时间。如果是,则记录被注销并重定向到登录页面。此外,每次请求到来并设置记录时,我们都会在其作用域会话内设置最后一次请求时间,以验证以下请求中的超时。 devise/timoutable.rb
    【解决方案2】:

    编辑:我的第一个回答类似于下面线程中的第一个答案,但该线程中的第二个答案可能更合适。因为它直接与 session_store 一起工作。

    这是一个有用的 StackOverflow 链接,可以提供额外信息:Rails 4: Session Expiry?

    此文档包含有关可用于会话操作的方法的一些信息:http://api.rubyonrails.org/classes/ActionDispatch/Session/CookieStore.html

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 2017-06-27
      • 1970-01-01
      • 2016-12-22
      • 2021-02-06
      • 2014-10-21
      • 1970-01-01
      • 2011-02-02
      • 2017-05-17
      相关资源
      最近更新 更多