gpt4 book ai didi

ruby - 无法在 Sinatra 应用程序中使用 Warden : env ['warden' ] returns nil

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:28 24 4
gpt4 key购买 nike

我正在编写一个 Sinatra Rack 应用程序,我想使用 Warden 进行身份验证。我正在使用 heroku 的工具带,所以我使用工头来运行我的应用程序。我找到了 some code这大概应该让这个工作。不幸的是,当我尝试实际访问 Warden env 对象时,它是 nil。

我尝试使用 sinatra_warden gem ,但它也有它的 own bugs (可能与此有关)。

配置.ru:

require './web.rb'
use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"
run MyApp

网络.rb:

require 'sinatra'
require 'warden'
require 'data_mapper'

require './config/datamapper.rb'
require './config/warden.rb' # I've tried this inside of MyApp, still didn't work

class MyApp < Sinatra::Base

get '/test' do
env['warden'].authenticate! # env['warden'] is nil :(
end

end

配置/warden.rb:

use Rack::Session::Cookie, :secret => ENV['SESSION_SECRET']

use Warden::Manager do |manager|
manager.default_strategies :password
manager.failure_app = MyApp.new
end

Warden::Manager.serialize_into_session { |user| user.id }
Warden::Manager.serialize_from_session { |id| User.get(id) }

Warden::Manager.before_failure do |env,opts|
# Sinatra is very sensitive to the request method
# since authentication could fail on any type of method, we need
# to set it for the failure app so it is routed to the correct block
env['REQUEST_METHOD'] = "POST"
end

Warden::Strategies.add(:password) do
def valid?
params["email"] || params["password"]
end

def authenticate!
u = User.authenticate(params["email"], params["password"])
u.nil? ? fail!("Could not log in") : success!(u)
end
end

版本:

  • 辛纳屈:1.1.0
  • 典狱长:1.2.1
  • Rack :1.4.1
  • ruby :1.9.3p194
  • 工头:0.60.0

关于如何使用我所描述的设置的 Warden 有什么想法吗?

(附:出于好奇,env 变量到底是什么?)

最佳答案

Rack 内部使用类 Rack::Builder解析您的 config.ru 文件并包装指令以构建中间件组件。

我相信您在 config/warden.rb 中对 use 的构建器调用被忽略了。从该文件中删除指令并将它们添加到 config.ru 中的中间件堆栈可能会起作用:

require './web.rb'

use Rack::Session::Cookie, :secret => ENV['SESSION_SECRET']

use Warden::Manager do |manager|
manager.default_strategies :password
manager.failure_app = MyApp.new
end

use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"

run MyApp

关于ruby - 无法在 Sinatra 应用程序中使用 Warden : env ['warden' ] returns nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13242684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com