特定的Rails路由密码保护

6ft*_*Dan 2 rack ruby-on-rails-4

我想要一个密码网站,就像Rack的Basic AUTH一样

/config.ru

use Rack::Auth::Basic, "Restricted Area" do |username, password|
  [username, password] == ['admin', 'admin']
end

run Rails.application
Run Code Online (Sandbox Code Playgroud)

我不希望它阻止路径 /API/mailgun/incoming_email密码访问.我可以在Rack中完成此操作吗?或者我应该在routes.rb中实现一个范围,几乎所有资源都在Rack(输入一次)密码后面?

为了记录我在网站内使用Devise ......这是独立的.我之前需要一个站点密码.

[修订问题]

具体路线

我想密码保护只有根路径//visitors机密像密码.我已经看过Rails routes.rb文件中使用的东西,之前有一个需要密码的lambda条件.我现在没有运气找到这些信息.

6ft*_*Dan 5

我的网站已经将未经身份验证的Devise用户重定向到/users/sign_in.所以我只需要密码保护/,/users/sign_in以及/users/sign_up.这就是我做到的.

config.ru

class RootSiteAuth < Rack::Auth::Basic
  def call(env)
    request = Rack::Request.new(env)
    if ['/', '/users/sign_in', '/users/sign_up'].include? request.path
      super
    else
      @app.call(env)
    end
  end
end

use RootSiteAuth, "Restricted Area" do |username, password|
  [username, password] == ['admin', 'admin']
end

run Rails.application
Run Code Online (Sandbox Code Playgroud)

它有效.每个控制器都before_filter :authenticate_user!重定向到机架密码页面.身份验证后,我们很高兴.没有过滤器的任何东西都允许按计划进行外部访问 ^ _ ^

  • 极好的!这也适用于 Jekyll-Rack 应用程序。我刚刚实现了这个确切的代码块,用 `run Rack::Jekyll.new` 替换了 `run Rails.application`。 (2认同)