我想为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 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
我想尝试一个简单的机架中间件"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运行它们.
这是我的具体问题:
非常感谢!
我查看了一些答案 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) 我正在尝试学习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,但再次面临同样的错误。
我在这里缺少什么?
请帮忙。
我正在研究一个事件处理程序来报告远程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工作了一年多,但这是我第一次使用机架和中间件.
任何建议表示赞赏!
我正在尝试为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.是否还有其他模式可以开始修改身体?
运行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
我在使用 Rails 5 中的中间件时遇到问题,我试图POST通过在中间件中使用来操作 http中发送的参数,但在调用Rack::Request该函数之前,发送的参数不会被弹出。@app.call(env)
使用 byebug 访问变量env并request得到以下结果:
(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) 我正在尝试在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 ×10
rack ×6
middleware ×3
heroku ×2
ruby ×2
activeadmin ×1
cookies ×1
multi-tenant ×1