【问题标题】:Dropwizard - how to achieve custom authorization scheme?Dropwizard - 如何实现自定义授权方案?
【发布时间】:2016-05-07 17:35:02
【问题描述】:

我正在尝试将 Dropwizard 用作完整的 Web 服务器,通过 REST API 结合服务公共页面、受保护页面和数据。因此,我通过应用基于计算的令牌和领域的自定义授权方案来管理不同的安全区域来验证保护某些路由的能力。

我很难理解如何达到目的。我期待的顺序如下:

  • 显示带有用户表单的 HTML 登录页面
  • 用户输入其凭据
  • 调用身份验证路由来验证凭据并为用户创建令牌。发回带有授权标头的欢迎页面,例如:MyScheme token="TYGDF655HD88D098D0970CUCHD987D897", realm="SUPER SECRET STUFF"
  • 用户单击链接以列出其发票:/html/invoices
  • 此路由受 DropWizard @Auth 注解保护
  • 浏览器未发送任何标头,因此服务器以带有标头的 401 响应进行响应:WWW-Authenticate MyScheme realm="SUPER SECRET STUFF",要求浏览器为其提供与挑战匹配的授权标头

不幸的是,浏览器没有向它发送此标头。根据许多文章,我认为浏览器管理所有接收到的凭据、它们的方案和参数(例如领域)的授权缓存。

似乎浏览器对于基本身份验证等众所周知的方案具有这种行为,但对于自定义方案则没有(顺便说一下,这通常是基本身份验证的问题,因为浏览器无法“注销”用户,因为他没有擦除网络历史记录或关闭浏览器)。

您认为如何告诉浏览器缓存授权凭据并在每次服务器请求使用正确的方案/领域挑战它时添加它们?

我可以在这里显示我用来运行这个示例的所有示例代码。

参考(好读):RFC1945 https://www.rfc-editor.org/rfc/rfc1945#section-11

感谢您的帮助。

在 Jdk Oracle 1.8 / Debian 8 上运行 dropWizard 0.9.2。

【问题讨论】:

    标签: rest authentication webserver authorization dropwizard


    【解决方案1】:

    浏览器不管理授权。它永远不会,或者至少永远不会。

    服务器应始终保留其缓存,并验证来自浏览器的输入。

    在基本级别上,您需要的所有字段都是 HTTP 标头的一部分。如果您注入请求,您将可以访问它们。

    如果 dropwizard 没有您需要的东西,您可以随时忽略所有内容,只需读取请求标头并进行您需要的自定义处理。

    例如,添加一个过滤器来设置realm,类似于WWW-Authenticate: Basic realm="myrealm:"

    Authorization: MyScheme Ceasar-cipher-password。您需要自己解析和处理它,也许对所有请求或选择性请求设置传入过滤器。

    这是个好主意吗,我让你来评判。也许,在您的用例中它是有道理的。

    如果您查看源代码以及 BasicCredentials 的使用方式,也许它可以为您提供可能的解决方案的洞察力,您可以自行调整。

    希望对你有帮助。

    【讨论】:

    • 感谢您的回复。如果浏览器不应该管理授权缓存,他如何回复一个401查询,这会质疑它在安全区域中的一些凭据?如果涉及基本身份验证,浏览器可以打开一个登录对话框,然后发送回适当的标题,但对于未知方案,如何进行?
    • @mnementh64 浏览器的工作是简单地构造一个请求并将其传递给服务器。服务器以错误消息响应。因此,如果您收到 401,则服务器正在处理它。在我看来,您应该调试服务器代码。您应该在服务器上编写将处理自定义标头的代码。
    • 哦,对不起,我没有说清楚。那是响应 401 状态响应的服务器,这是正常的,因为您想要访问的资源需要身份验证。所以这取决于浏览器来做些什么。我知道这种情况通常是通过 cookie 管理的(在每个请求中由浏览器重新发送)。一定有什么我想念的……
    • @mnementh64 一旦服务返回 401,你需要在你的应用程序中管理你需要做的事情......有些框架可能会自动完成,其他的,你可能需要编写一些代码...也许,您可以澄清问题出在哪里..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2020-07-18
    • 2020-09-09
    • 2020-06-03
    • 2021-12-12
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多