更新。一般来说,假设目标服务器是公开可用的,您应该考虑身份验证策略,因为仅在您的临时服务器上检查它是不安全的。
基本上,您的问题的答案是 - 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