- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
这里的问题是同一 Sinatra (Rack) 应用程序的多个实例部署在 Passenger+Apache 上的不同子 URI 上,使用 HTTP 基本身份验证来阻止不需要的访问:
我在我的域中部署了 4 个 Sinatra 应用实例:
example.com/private/foo
example.com/private/moo
...
...
使用 Rack::Auth::Basic
中间件通过 HTTP 基本身份验证保护对它们的访问。 config.ru
所有这些看起来像:
# ...
users = {'user' => 'password'}
use Rack::Auth::Basic, 'realm' do |username, password|
users.key?(username) && users[username] == password
end
run MyApp
从一个 config.ru
到另一个的唯一变化是“realm”参数。
现在的问题是,一旦我登录其中一个应用程序,比如 private/foo
,Chrome 就不会提示我输入其他应用程序的用户名和密码(private/moo
等)。这是违反直觉的,因为所有实例都由它们的 URL 唯一标识。为每个实例使用不同的凭据确实有效,但 Chrome 不应该为每个实例至少请求一次凭据吗?我注意到的一件事是,我第一次登录其中一个实例时,Chrome 显示“位于 example.com:80 的服务器需要用户名和密码”。我本以为“资源 example.com/private/foo 需要用户名和密码”。这不是应该的工作方式吗?
我检查了 Rack::Auth::Basic
源代码和维基百科关于 HTTP Basic Auth 的文章并没有想出任何可以帮助我的案子:(。
最佳答案
在基本身份验证中,realm 参数不会发送回服务器。所以服务器无法真正检查客户端是否正在为同一领域发送授权 header 。这取决于客户。 Rack 对 HTTP 基本身份验证的实现是正确的。所以:
Now the issue is that once I have logged into one of the apps, say private/foo, Chrome doesn't prompt me for a username and password for other apps (private/moo etc.). This is counterintuitive since all instances are uniquiely identified by their URLs.
正如 Andrew 指出并从 RFC 中明确指出的那样,URL 在那里不起作用。但是,如果 '/foo' 受到保护,则 '/foo/moo' 也受到同一领域的保护。
Using different credentials for each instance does work, but shouldn't Chrome request credentials at least once for each instance?
在幕后发生的事情(在使用调试器工具检查时)是,在我登录到其中一个应用程序后,比如 private/foo,Chrome 将相同的授权 header 重新发送到其他应用程序,比如 private/哞哞叫,没有先被挑战。
RFC 说客户端可以发送一个域的相应授权 header ,而无需首先受到服务器的质询。
看起来 Chrome 要么将我的所有应用程序视为同一领域,要么在不同领域重新发送相同的授权 header 。我不认为这是预期的行为,但我可能会遗漏一些东西。 Firefox 的行为相同。无论如何,这不是问题的本质。
问题的主题是“我如何让 Chrome 为每个实例至少请求一次用户名和密码?基本身份验证没有按我预期的方式工作;为什么?”
使用摘要式身份验证(再次使用 RFC 2617)。 Rack在Rack::Auth::Digest::MD5
下实现了MD5算法版本。为每个实例设置不同的 opaque
就可以了:
# ...
realm = "Description of the protected area."
opaque = "Secret key that uniquely identifies a realm."
users = {'user' => 'password'}
use Rack::Auth::Digest::MD5, realm, opaque do |username|
users[username]
end
opaque
由客户端发回,可以在服务器端验证授权请求是针对正确的资源。 realm
的工作本质上似乎是描述性的——您要保护哪个区域或资源?我刷什么id?
关于ruby - 如何使用带有 HTTP 基本身份验证的 Passenger(在 Apache 上)部署多个 Rack/Sinatra 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9251704/
您在 Sinatra 应用程序中使用什么验证码? 我喜欢 Google 的 http://www.google.com/recaptcha ,但似乎不适用于 Sinatra(不过有一个 Rails 插
如何从命令行将 Sinatra 应用作为守护程序运行? 它正在使用瘦: ruby app.rb -p 3000 -e production 我不喜欢在 app.rb 本身中设置它。我想从命令行取消它。
我正在使用 Sinatra 在 Ruby 中编写一个小型 Web 服务。使用 http 基本身份验证(在生产中通过 https)控制对几乎所有内容的访问。 我想从要求授权中排除一个特定的目录。是否有捷
我曾经能够在启动 sinatra 应用程序的窗口中看到为 sinatra 发出的 http 请求。 我认为在 sinatra 升级后我再也看不到它们了,我不知道如何做到这一点。我不需要将它们记录到文件
带有 activerecord gem 的 Sinatra 项目发出警告: DEPRECATION WARNING: Currently, Active Record suppresses error
我正在玩 Sinatra,我想让我的一条路线不区分大小写。我尝试添加这样的路线: get "(?i)/tileflood/?" do end 但它与预期的/tileflood 的任何排列都不匹配。我在
如果我没有在 Sinatra 中明确设置 session 过期时间,那么默认的过期时间是多少? 最佳答案 Sinatra session 来自 Rack::Session;所以开箱即用它默认为不过期。
似乎没有关于如何使用 Sinatra 中的 Rack::Protection 为表单启用 CSRF 保护的文档。有人做过这个吗?我似乎不知道如何告诉 Sinatra 启用此功能。 最佳答案 Sinat
假设我有一条 Sinatra 路线: put '/data' do request.body.read # ... end 看起来整个 request.body 都被读入内存了。有没有办法在主
我正在 Sinatra 中运行一个经典风格的应用程序,我想获取该应用程序绑定(bind)到的 URL。例如,如果我在开发环境中启动它,我希望得到:http://localhost:4567/,而在生产
我正在尝试在我的 Mac 上安装以下 ruby gem: http://www.sinatrarb.com/intro.html 我收到以下消息: michael-rosarios-mac
我最近更新到了 Ruby 1.9.2 (RVM)、Sinatra 1.1 和 Passenger 3.0.0。我有一个简单的应用程序,由以下部分组成: # config.ru require 'rub
似乎没有关于如何使用 Sinatra 中的 Rack::Protection 为表单启用 CSRF 保护的文档。有人做过这个吗?我似乎不知道如何告诉 Sinatra 启用此功能。 最佳答案 Sinat
与 sinatra 应用程序相比,Rack 应用程序有哪些优势? 谢谢 最佳答案 我认为提问者想要将它保留在 Rack 上的优点。 考虑到 Sinatra 已经是典型 Web 应用程序的极薄和简约的贴
我最近创建了一个带有登录表单(无基本身份验证)的 Sinatra 应用程序。为了防止在用户登录之前访问该应用程序,我在适当的位置放置了一个 before block before do unles
我如何设置 Sinatra 以便公用文件夹中的静态文件与响应 Access-Control-Allow-Origin = "*"一起返回? 最佳答案 在这里查看这个问题:Sinatra OPTIONS
我有一个基于 Sinatra 的 REST 服务应用程序,我想从其中一个路由中调用其中一个资源,从而有效地将一个资源与另一个资源组合在一起。例如 get '/someresource' do ot
我有一个使用经典 Sinatra 的旧项目(不是模块化 我在互联网上能找到的唯一使用 Puma 的示例是使用模块化 Sinatra。 引用:http://www.sinatrarb.com/intro
问题是默认处理程序是在 中定义的。 Sinatra::ShowExceptions ,由 控制:raise_errors 配置设置,这个设置是全有或全无。如果 :raise_errors 关闭然后 错
我有以下 Sinatra 应用程序,我正在测试 error阻止但它似乎不起作用。 这是我的 sinatra 应用程序: require 'rubygems' require 'sinatra' err
我是一名优秀的程序员,十分优秀!