有没有办法为heroku上的应用程序设置简单的http身份验证?

时间:2010-10-01 12:36:16

标签: ruby http authentication heroku

我想使用简单的http身份验证在heroku上设置私有临时服务器。这可能吗?

6 个答案:

答案 0 :(得分:52)

更简洁的方法是将几行Rack中间件放入您的暂存环境配置中,只留下控制器逻辑:

# config/environments/staging.rb
MyApp::Application.configure do
  config.middleware.insert_after(::Rack::Lock, "::Rack::Auth::Basic", "Staging") do |u, p|
    [u, p] == ['username', 'password']
  end

  #... other config
end

此提示由Ole Morten Amundsen提供。更多信息加上Heroku密码规范:

http://olemortenamundsen.wordpress.com/2011/04/05/ruby-secure-staging-environment-of-your-public-app-from-users-and-bots/

答案 1 :(得分:14)

在Rails4上,我得到“没有这样的中间件插入后:Rack :: Lock”错误。将Adam的代码替换为以下代码:

# config/environments/staging.rb
MyApp::Application.configure do
  config.middleware.use '::Rack::Auth::Basic' do |u, p|
    [u, p] == ['username', 'password']
  end
  # ...
end

请参阅:http://www.intridea.com/blog/2013/6/4/tips-and-tricks-for-deploying-rails-4-apps-on-heroku

答案 2 :(得分:7)

绝对。最简单的解决方案是在应用程序控制器中添加一些内容,使用Rails内置的基本身份验证支持(请参阅此处:http://railscasts.com/episodes/82-http-basic-authentication),然后将其包装在Rails.env的条件中。请注意,在Heroku上,默认情况下RAILS_ENV设置为production,但您可以使用heroku confighttp://docs.heroku.com/config-vars)为非生产应用更改此设置。

你也可以考虑安装一些路障式的Rack中间件,但我会选择上面的。

答案 3 :(得分:2)

有一个很好的heroku附加组件,它使用Mozilla Persona进行身份验证。对于小批量站点(每月10,000次以下的身份验证),它是免费的:

https://addons.heroku.com/wwwhisper

非常易于安装和配置。

答案 4 :(得分:1)

使用application_controller.rb执行此操作的另一种方法:

  # app/controllers/application_controller.rb
  before_filter :http_basic_auth

  def http_basic_auth
    if ENV['HTTP_AUTH'] =~ %r{(.+)\:(.+)}
      unless authenticate_with_http_basic { |user, password|  user == $1 && password == $2 }
        request_http_basic_authentication
      end
    end
  end

然后你需要导出你的值: 发展:

 export HTTP_AUTH=test:test

对于heroku:

 heroku config:set HTTP_AUTH=test:test

现在,在窗口提示时,您应输入user / password =>测试/检验。

希望你发现它很有用。

答案 5 :(得分:1)

Rails 5的更新答案。在您的config/application.rb或选定的环境配置中:

config.middleware.use(Rack::Auth::Basic) do |u, p|
  [u, p] == ["user", "password"]
end

此外,Ole's blog post中已指出要使用ENV变量。我补充说,如果未设置env var,则默认使用随机密码是个好主意:

config.middleware.use(Rack::Auth::Basic) do |u, p|
  [u, p] == [ENV['USER'], ENV['PASSWORD'] || SecureRandom.hex]
end