3

配置/应用程序.rb

config.middleware.insert_before(Rack::Runtime, Rack::ReverseProxy) do
  reverse_proxy_options preserve_host: false
  reverse_proxy '/external/app', 'https://runalong.com:64167/app'
end

我正在使用 rack-reverse-proxy 将请求转发到在请求特定 url 时在不同主机中运行的另一台服务器(不是 rails 服务器)。现在我想使用设计验证用户是否已登录,然后仅将请求转发到代理服务器,否则将用户发送回登录页面。

4

1 回答 1

5

更新。一般来说,假设目标服务器是公开可用的,您应该考虑身份验证策略,因为仅在您的临时服务器上检查它是不安全的。

基本上,您的问题的答案是 - Devise 不会向 Rails 应用程序添加任何自己的中间件,因此您不能在中间件中使用 Devise。您可能会使用 Warden 中间件。

设计坐在监狱长的顶部。设计在中间件堆栈的末尾注入 中间件(它也可以注入omniauth中间件):Warden::Manager

# Initialize Warden and copy its configurations.
config.app_middleware.use Warden::Manager do |config|
  Devise.warden_config = config
end

除此之外,Devise 在 Rails 应用程序级别上工作,即添加诸如sign_in控制器之类的助手。但它不适用于中间件级别本身。

Warden 本身就是“懒惰的”,这里有描述

Warden被设计成懒惰的。也就是说,如果您不使用它,它不会做任何事情,但是当您使用它时,它会立即发挥作用并提供底层机制以允许在任何基于 Rack 的应用程序中进行身份验证。

因此,除非设计会以某种方式与守望者一起操纵,否则守望者不会做太多事情。Warden 所做的是将自己嵌入到其他中间件(以及 Rails 应用程序)可访问的 env 变量中。设计使用这个实例。

env['warden'] = Proxy.new(env, self)

Warden 还监听其他中间件(或在 end rails 应用程序中)可以抛出的特殊warden 异常:

 result = catch(:warden) do
   @app.call(env)
 end

为了在中间件中使用 Warden,您需要更早地嵌入中间件(在您的目标中间件之前)。然后你就可以使用 Warden(而不是设计助手!)。

根据warden source中的评论,它应该嵌入在(不早于)会话构建中间件之后,例如ActionDispatch::Session::CookieStore

用于机架身份验证的中间件 中间件要求上游有会话 中间件将身份验证对象注入机架环境哈希

会话的Warden访问器:

def session
  env["rack.session"] || {}
end
于 2016-07-01T11:17:48.427 回答