Rails 应用程序中的 DeviseTokenAuth
DeviseTokenAuth in Rails Application
我正在我的 Rails 应用程序中实现一个会话,我正在使用 DeviseTokenAuth
gem。
我想实现一个场景,如果用户在 15 分钟内没有从前端发送请求,那么会话应该过期;会话有效期为 15 分钟。但是,如果用户连续发送请求,则应将会话时间延长 15 分钟。我正在分享我的 DeviseTokenAuth
配置代码。
DeviseTokenAuth.setup do |config|
config.change_headers_on_each_request = true
config.token_lifespan = 15.minutes
config.token_cost = Rails.env.test? ? 4 : 10
config.batch_request_buffer_throttle = 30.seconds
end
如果我做错了什么,请告诉我
好的,所以您已将 token_lifespan
设置为 15 分钟(DeviseTokenAuth 将其理解为“自上次登录以来的 15 分钟”),但您实际上希望它是 last_accessed_at + 15.minutes
。这并不是 DeviseTokenAuth 真正设计的目的,因此您需要为此编写自己的处理程序。
您可能需要一个每次收到请求时运行的 before_action
,它检查自上次请求以来已经过了多长时间,如果超过 15 分钟则使令牌无效。并且您将需要一个匹配的 after_action
过滤器,用于存储用户上次访问数据库中的应用程序的时间(在类似于 last_accessed_at
的字段中,类似于自动 created_at
字段)。
您可以创建一个单独的列,last_accessed_at
应该是用户 table 中的 DateTime
字段。
然后,在 app/controllers/application_controller.rb
中添加以下代码片段
before_action :authenticate_user!, :validate_last_accessed
def validate_last_accessed
if (current_user.last_accessed_at + 14.minutes) < DateTime.now
current_user.tokens = {}
current_user.save
render json: {success: false, message: "your message in here"}
else
current_user.update(last_accessed_at: DateTime.now)
end
end
无需将令牌过期时间设置为 15 分钟,您甚至可以将其设置为任意数量的 days/weeks。如果用户未在给定时间范围内(在本例中为 15 分钟)访问应用程序,则令牌将被清除。
专业提示:为了使用此功能,对于每个请求,您都必须访问数据库以更新记录。我建议您使用 redis
等缓存数据库来 store/update 用户上次访问时间。
另一种解决方案:您可以在每个控制器响应中发送 current datetime
,让前端负责时间范围。
我正在我的 Rails 应用程序中实现一个会话,我正在使用 DeviseTokenAuth
gem。
我想实现一个场景,如果用户在 15 分钟内没有从前端发送请求,那么会话应该过期;会话有效期为 15 分钟。但是,如果用户连续发送请求,则应将会话时间延长 15 分钟。我正在分享我的 DeviseTokenAuth
配置代码。
DeviseTokenAuth.setup do |config|
config.change_headers_on_each_request = true
config.token_lifespan = 15.minutes
config.token_cost = Rails.env.test? ? 4 : 10
config.batch_request_buffer_throttle = 30.seconds
end
如果我做错了什么,请告诉我
好的,所以您已将 token_lifespan
设置为 15 分钟(DeviseTokenAuth 将其理解为“自上次登录以来的 15 分钟”),但您实际上希望它是 last_accessed_at + 15.minutes
。这并不是 DeviseTokenAuth 真正设计的目的,因此您需要为此编写自己的处理程序。
您可能需要一个每次收到请求时运行的 before_action
,它检查自上次请求以来已经过了多长时间,如果超过 15 分钟则使令牌无效。并且您将需要一个匹配的 after_action
过滤器,用于存储用户上次访问数据库中的应用程序的时间(在类似于 last_accessed_at
的字段中,类似于自动 created_at
字段)。
您可以创建一个单独的列,last_accessed_at
应该是用户 table 中的 DateTime
字段。
然后,在 app/controllers/application_controller.rb
before_action :authenticate_user!, :validate_last_accessed
def validate_last_accessed
if (current_user.last_accessed_at + 14.minutes) < DateTime.now
current_user.tokens = {}
current_user.save
render json: {success: false, message: "your message in here"}
else
current_user.update(last_accessed_at: DateTime.now)
end
end
无需将令牌过期时间设置为 15 分钟,您甚至可以将其设置为任意数量的 days/weeks。如果用户未在给定时间范围内(在本例中为 15 分钟)访问应用程序,则令牌将被清除。
专业提示:为了使用此功能,对于每个请求,您都必须访问数据库以更新记录。我建议您使用 redis
等缓存数据库来 store/update 用户上次访问时间。
另一种解决方案:您可以在每个控制器响应中发送 current datetime
,让前端负责时间范围。