DropWizard 身份验证领域

Posted

技术标签:

【中文标题】DropWizard 身份验证领域【英文标题】:DropWizard Auth Realms 【发布时间】:2015-02-10 04:58:16 【问题描述】:

在 DropWizard 中,我可以像这样设置基本身份验证(在 Application#run impl 中):

BasicAuthProvider<SimplePrincipal> authProvider = new BasicAuthProvider(authenticator, "SECRET_REALM");
environment.jersey().register(authProvider);

我想知道String realm ("SECRET_REALM") 的意义是什么?

根据一般的安全概念,我将“领域”理解为存储用户和角色/权限的地方(数据库、目录、文件、密钥库等)。

在 DropWizard 中域是什么意思,在 BasicAuthProvider 中指定它的意义是什么?它是否在这个领域创造了一些东西?

【问题讨论】:

【参考方案1】:

在某种意义上,领域是服务器中的一些受保护区域/空间。领域应该有一个名字。如果我们从this post 运行示例,使用cURL(我建议下载它,因为它在开发中很有用),没有任何用户凭据,我们将看到以下内容。

C:\>curl -i  http://localhost:8080/simple
HTTP/1.1 401 Unauthorized
Date: Thu, 11 Dec 2014 18:55:02 GMT
WWW-Authenticate: Basic realm="Basic Example Realm"
Content-Type: text/plain
Transfer-Encoding: chunked

Credentials are required to access this resource.

这就是Basic Auth Protocol 的工作原理。当服务器希望用户代理进行身份验证以访问安全资源时,它会返回一个“401 Unauthorized”,以及类似于

的标头
WWW-Authenticate: Basic realm="Basic Example Realm"

您提供给BasicAuthProvider 的名称是realm,它将在标题中提供。可以在source code看到

if (required) 
    final String challenge = String.format(CHALLENGE_FORMAT, realm);
    throw new WebApplicationException(
                                    Response.status(Response.Status.UNAUTHORIZED)
                    .header(HttpHeaders.WWW_AUTHENTICATE, challenge)
                    .entity("Credentials are required to access this resource.")
                    .type(MediaType.TEXT_PLAIN_TYPE)
                    .build());

现在尝试从浏览器访问资源。你会看到

您还可以在此处查看领域名称。 RFC 2617 只是声明(关于realm):

领域: 要显示给用户的字符串,以便他们知道哪个用户名和 使用密码。此字符串应至少包含 执行身份验证的主机,并且可能另外 指示可能具有访问权限的用户的集合。一个例子 可能是“registered_users@gotham.news.com”。

【讨论】:

再次感谢@peeskillet (+1)!我已经发布了很多关于 SO 的问题,到目前为止,您是我在这里遇到的最彻底、响应最及时且乐于助人的用户。再次感谢!

以上是关于DropWizard 身份验证领域的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 请求未经客户端身份验证方案“基本”授权。从服务器收到的身份验证标头为“基本领域 =”

在 Glassfish 上进行领域身份验证后重定向

HTTP 请求未经客户端身份验证方案“匿名”授权。从服务器收到的身份验证标头是“基本领域”

了解基本 WWW 身份验证中“领域”的目的

Glassfish 在领域身份验证中创建多个 http 会话

我应该在摘要领域内协商 OAuth2 身份验证吗?