我是Ruby的新手,我可以找到这个问题的各种变体的答案,但不能找到问题本身的答案。
我正在编写一个应用程序,该应用程序获取基本的身份验证详细信息,并使用它们向第三方平台验证用户。因此,我需要能够访问密码以便将其传递给,但我还希望能够使用机架身份验证类
我想做的就是:
require 'rack/auth/abstract/request'
require 'rack/auth/basic'
class AuthRequest < Rack::Auth::Basic::Request < Rack::Auth::AbstractRequest
def password
credentials[1]
end
end
如果我使用Request < Auth::AbstractRequest
,IDE告诉我有未声明的常量,但如果我如上所述完全限定它,它会说"错误的参数类型true(预期的Class)(TypeError)">
我读了很多文章,包括这篇文章,但我也同样感到困惑,我认为问题源于我试图从这个外部文件扩展一个子类,而不是它的根类。
做这件事的正确方法是什么?
编辑-有关我的要求的更多信息:我的需求是基于Sinatra文档中的这个样本。我想要像provided?
和basic?
那样精确的@auth
对象,但由于我不能像@auth.credentials == ['admin', 'admin']
那样简单地进行比较,我需要访问密码,这在默认实现中是不允许的
helpers do
...
def authorized?
@auth ||= Rack::Auth::Basic::Request.new(request.env)
@auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['admin', 'admin']
end
end
我真的不明白你期望表达式class AuthRequest < Rack::Auth::Basic::Request < Rack::Auth::AbstractRequest
的行为,也许是某种多重继承?
这里的问题是,由于Rack::Auth::Basic::Request
是Rack::Auth::AbstractRequest
的子类,表达式Rack::Auth::Basic::Request < Rack::Auth::AbstractRequest
的计算结果为true
(参见Module#<
),因此您的表达式实际上被解释为class AuthRequest < true
,这毫无意义,因此TypeError
。
如果我做对了你正在尝试实现的以下代码应该做的事情:
class AuthRequest < Rack::Auth::Basic::Request
def password
credentials[1]
end
end