标签: rack-middleware

ActiveAdmin:如何设置HTTP基本身份验证?

我想为ActiveAdmin设置基本身份验证,内部设计解决方案不适用于我的情况.为此,我希望能够将中间件添加到ActiveAdmin引擎,然后将其捆绑到我的应用程序中.我设法做的是:

ActiveAdmin::Engine.configure do |config|
  config.middleware.use Rack::Auth::Basic do |username, password|
    username == 'admin' && password == 'root'
  end  
end
Run Code Online (Sandbox Code Playgroud)

但显然这不起作用,因为我的主动管理路线仍未受到保护.我怎样才能有效地做到这一点?不,我不想用基本身份验证保护我的整个网站.

ruby-on-rails rack-middleware activeadmin

6
推荐指数
1
解决办法
4017
查看次数

如何在Rails中动态更改会话cookie名称?

我有一个 Ruby on Rails 4.2 多租户应用程序,我希望每个租户使用它自己的会话 cookie 和 cookie 选项。我尝试了不同的方法,但无法让每个细节都正确。

为了添加更多上下文,在中间件中从请求中的主机 URL 中选择租户,并将其设置为我可以在堆栈中访问的线程变量。我们将该设置对象称为Settings.current_account

选项 1:中间件

class AccountableSessionCookies
  def initialize(app)
    @app = app
  end

  # @param [Hash] The Rack environment.
  def call(env)
    dup.call!(env)
  end

  # @param env [Hash] The Rack environment.
  def call!(env)
    env['rack.session.options'][:key] = Settings.current_account.session_key
    env['rack.session.options'][:expire_after] = Settings.current_account.session_expiration
    @app.call(env)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在初始化程序中

Rails.application.config.session_store :cookie_store, key: 'bla',
                                                      expire_after: 1_209_600
Run Code Online (Sandbox Code Playgroud)

结果:这将允许我设置expire_after,但不能设置 cookie 名称,该名称将保留bla

选项 2:自定义 cookie 存储

module ActionDispatch
  module Session
    class AccountCookieStore < CookieStore …
Run Code Online (Sandbox Code Playgroud)

cookies ruby-on-rails multi-tenant rack-middleware ruby-on-rails-4

6
推荐指数
0
解决办法
1252
查看次数

带有rails 3的Hello World机架中间件:如何处理所有请求的主体

我想尝试一个简单的机架中间件"hello world",但我似乎陷入困境.看起来主要的sytax发生了变化,因为一些例子使用了这段代码:

require 'rack/utils'

class FooBar

  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
         body.body << "\nHi from #{self.class}"
         [status, headers, body]
  end
end
Run Code Online (Sandbox Code Playgroud)

产生错误:

undefined method `<<' for #<ActionDispatch::Response:0x103f07c48>
Run Code Online (Sandbox Code Playgroud)

即使我看到那里的其他代码,我似乎无法使用rails 3.0.3运行它们.

这是我的具体问题:

  • 我怎么能得到一个简单的机架中间件来运行和修改rails应用程序的任何输出的主体?
  • 我应该把Rails.application.config.middleware.use声明放在哪里?(我在配置/初始化器中创建了一个自己的初始化器)

非常感谢!

rack middleware rack-middleware ruby-on-rails-3

5
推荐指数
2
解决办法
5465
查看次数

Rails4.1中机架中间件放在哪里

我查看了一些答案 1] 包含在 qoutes 中,2] 不要使用 require 等,但它们都不起作用。Rails4 中的解决方案可能已更改

我正在尝试按照此处的教程进行操作https://devcenter.heroku.com/articles/ruby-websockets#using-with-rails

它说将现有的 ChatBackend 中间件复制到 Rails 项目中的 app/middleware/chat_backend.rb 。然后将中间件插入到您的堆栈中,在 config/application.rb 中定义:

require 'chat_backend'
config.middleware.use ChatDemo::ChatBackend
Run Code Online (Sandbox Code Playgroud)

我在 app/middlewares/chat_backend.rb 中定义了中间件,如下所示:

require 'faye/websocket'
require 'thread'
require 'redis'
require 'json'
require 'erb'

    module ChatDemo
      class ChatBackend
        KEEPALIVE_TIME = 15 # in seconds
        CHANNEL        = 'twitter-stream'
        def initialize(app)
        end
      /// DELETED CODE for simplicity
    end
Run Code Online (Sandbox Code Playgroud)

这是应用程序.rb

require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'chat_backend'  <= ERROR: config/application.rb:4:in `require': cannot load such file -- chat_backend (LoadError)

Bundler.require(*Rails.groups)

module …
Run Code Online (Sandbox Code Playgroud)

rack ruby-on-rails heroku rack-middleware ruby-on-rails-4.1

5
推荐指数
2
解决办法
3713
查看次数

如何在 Rails 4.2 应用程序中添加中间件

我正在尝试学习Middlewares并练习如何在 Rails 应用程序中安装它。我已经关注了railscast

到目前为止,我已经实施了以下步骤:

1) 创建了一个Rails 4.2名为:Blog的新应用程序

2)在lib文件夹中添加了一个名为response_timer.rb.

class ResponseTimer
  def initialize(app)
    @app = app
  end

  def call(env)
    [200, {"Content-Type" => "text/html"}, "Hello World"]
  end
end
Run Code Online (Sandbox Code Playgroud)

3) 添加config.middleware.use "ResponseTimer"application.rb.

config.middleware.use "ResponseTimer"
Run Code Online (Sandbox Code Playgroud)

但是当我rake middleware在终端中执行命令时,它报告了这个错误:

rake aborted!
NameError: uninitialized constant ResponseTimer
Run Code Online (Sandbox Code Playgroud)

我也尝试添加config.middleware.use "ResponseTimer"development.rb,但再次面临同样的错误。

我在这里缺少什么?

请帮忙。

参考文章:http : //guides.rubyonrails.org/rails_on_rack.html

ruby ruby-on-rails rack-middleware ruby-on-rails-4

5
推荐指数
1
解决办法
1997
查看次数

如何从gem中添加机架中间件到rails应用程序

我正在研究一个事件处理程序来报告远程api的异常(类似于newrelic代理),我找不到将我的中间件添加到机架而不在environment.rb文件中执行的方法.

我不想在environment.rb文件中这样做,因为我打算把它变成一个gem,我想最小化安装过程.

这是我想要添加到我的应用程序中的简单中间件:

#/lib/response_timer.rb
class ResponseTimer
  def initialize(app)
    @app = app
  end

  def call(env)
    #do something here
    @app.call(env)
  end
end
Run Code Online (Sandbox Code Playgroud)

我可以找到包含它的唯一方法是将其添加到我的环境cofig:

config.middleware.use "ResponseTimer"
Run Code Online (Sandbox Code Playgroud)

我已经使用rails工作了一年多,但这是我第一次使用机架和中间件.

任何建议表示赞赏!

ruby rack ruby-on-rails rack-middleware ruby-on-rails-3

4
推荐指数
1
解决办法
1894
查看次数

改变Rack Middleware中的response.body

我正在尝试为Rails 4.2应用程序编写一些Rack Middleware,它使用该gsub方法改变响应体.我找到了使用这样的模式的旧例子:

class MyMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    # do some stuff
    [status, headers, response]
  end
end
Run Code Online (Sandbox Code Playgroud)

我发现的是没有setter方法response.body.是否还有其他模式可以开始修改身体?

rack ruby-on-rails rack-middleware

4
推荐指数
1
解决办法
2484
查看次数

如何在机架级别阻止请求?

运行Rails4应用程序时,我经常看到机器人正在探究我是否正在运行Wordpress网站.我希望他们想要创建评论垃圾邮件或寻找Wordpress安全漏洞.

这是日志中的示例错误:

ActionController::RoutingError (No route matches [GET] "/wp-login.php")
Run Code Online (Sandbox Code Playgroud)

什么是Rack中间件的简单示例,我可以阻止此http请求?我如何命名文件以及它在Rails应用程序中的位置?

谢谢!

rack middleware ruby-on-rails rack-middleware ruby-on-rails-4

4
推荐指数
1
解决办法
1023
查看次数

如何访问中间件rails 5中的params变量

我在使用 Rails 5 中的中间件时遇到问题,我试图POST通过在中间件中使用来操作 http中发送的参数,但在调用Rack::Request该函数之前,发送的参数不会被弹出。@app.call(env)

使用 byebug 访问变量envrequest得到以下结果:

 (byebug) env.each{|key, value| p "#{key} --> #{value}"}
 "rack.version --> [1, 3]"
 "rack.errors --> #<IO:0x007fa00209eaa8>"
 "rack.multithread --> true"
 "rack.multiprocess --> false"
 "rack.run_once --> false"
 "SCRIPT_NAME --> "
 "QUERY_STRING --> "
 "SERVER_PROTOCOL --> HTTP/1.1"
 "SERVER_SOFTWARE --> puma 3.6.2 Sleepy Sunday Serenity"
 "GATEWAY_INTERFACE --> CGI/1.2"
 "REQUEST_METHOD --> POST"
 "REQUEST_PATH --> /some_path"
 "REQUEST_URI --> /some_path"
 "HTTP_VERSION --> HTTP/1.1"
 "HTTP_CACHE_CONTROL --> no-cache"
 "HTTP_POSTMAN_TOKEN --> 5a8514ac-9050-433e-be71-80316aa01e53"
 "CONTENT_TYPE --> application/json" …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rack-middleware ruby-on-rails-5

4
推荐指数
1
解决办法
3824
查看次数

在Heroku上使用Rails 3.2.3进行机架重写

我正在尝试在Heroku雪松堆栈上为Rails 3.2.3设置机架重写,并且在任何地方我都会看到它添加如下内容:

config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
  # rewrite rules
end
Run Code Online (Sandbox Code Playgroud)

但是试图在Heroku上运行它会给我一个错误:

`assert_index': No such middleware to insert before: Rack::Lock (RuntimeError)
Run Code Online (Sandbox Code Playgroud)

确实运行"heroku rake middleware"在开发时没有显示Rack :: Lock在Rack :: Lock就在那里.

第一个问题是Heroku上没有Rack :: Lock的原因,这是正确的吗?第二个问题,如果不是在Rack :: Lock之前,我应该在哪里插入Rack :: Rewrite?

谢谢!

rack middleware ruby-on-rails heroku rack-middleware

3
推荐指数
1
解决办法
949
查看次数