【发布时间】:2017-05-11 15:16:24
【问题描述】:
我正在开发一个包含许多角色的系统,其中一个角色是ADMIN,它可以访问系统的关键部分,我想限制用户的会话,当他/她不与系统交互时一段时间后,它的会话到期,下次他/她应该重新登录,我该怎么做?
【问题讨论】:
标签: ruby-on-rails session devise ruby-on-rails-5
我正在开发一个包含许多角色的系统,其中一个角色是ADMIN,它可以访问系统的关键部分,我想限制用户的会话,当他/她不与系统交互时一段时间后,它的会话到期,下次他/她应该重新登录,我该怎么做?
【问题讨论】:
标签: ruby-on-rails session devise ruby-on-rails-5
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' 来使用户会话超时,但要接受您的回答,有没有办法让您的解决方案仅针对不同的用户类型动态?
timedout?方法。
timeoutable.rb 的此评论“每次设置记录时,我们都会检查其会话是否已经超时,基于上次请求时间。如果是,则记录被注销并重定向到登录页面。此外,每次请求到来并设置记录时,我们都会在其作用域会话内设置最后一次请求时间,以验证以下请求中的超时。 devise/timoutable.rb
编辑:我的第一个回答类似于下面线程中的第一个答案,但该线程中的第二个答案可能更合适。因为它直接与 session_store 一起工作。
这是一个有用的 StackOverflow 链接,可以提供额外信息:Rails 4: Session Expiry?
此文档包含有关可用于会话操作的方法的一些信息:http://api.rubyonrails.org/classes/ActionDispatch/Session/CookieStore.html
【讨论】: