设计跳过/资产请求的身份验证

时间:2015-09-01 16:58:17

标签: ruby-on-rails devise

我承认这在开发中更容易产生麻烦,并且在生产中不那么麻烦,但即使在生产中,我也不希望设计为/assets请求进行身份验证或添加任何开销。< / p>

在开发过程中,我们看到了大量以下内容(目前每个资产文件大约有30个):

Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2015-09-01 11:53:40 -0500
  AfCore::User Load (0.1ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 8  ORDER BY `users`.`id` ASC LIMIT 1

我查了一下,找不到与跳过资产相关的任何选项,我没有看到我们明确添加它们的位置,除非protect_from_forgery with: :exception之类的内容导致这种情况。

我们如何设计跳过所有资产请求?

1 个答案:

答案 0 :(得分:1)

我碰巧有权访问源代码,它与机架组件有关。在机架组件中调用warden.user是基于请求的,并将针对每个请求查询用户。以下是用于诊断的代码:

puts 'before warden.user'
if warden.presence && warden.user.presence
  security_context.user = warden.user
end
puts 'after warden.user'

和控制台输出:

before warden.user
User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3  ORDER BY `users`.`id` ASC LIMIT 1
after warden.user

***** EDIT *****

可以跳过:

def call(rack_env)

  if rack_env['PATH_INFO'] =~ /^\/assets/
    # avoid retrieving the session's user for unnecessary calls -  assets/validators
    @app.call(rack_env)
  else
    ...
    # warden.user stuff
    ...
    @app.call(rack_env)
  end