DropWizard Auth领域

时间:2014-12-11 16:13:49

标签: java authentication jersey jax-rs dropwizard

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

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

我想知道字符串realm(“ SECRET_REALM ”)的重要性是什么?

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

一个领域在DropWizard中意味着什么,以及在BasicAuthProvider中指定它的意义是什么?它是否会在这个领域创造出一些东西?

1 个答案:

答案 0 :(得分:13)

领域在某种意义上是服务器中的一些受保护区域/空间。领域应该有一个名字。如果我们从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的工作原理。当服务器希望用户代理进行身份验证时,为了访问安全资源,它将发回一个&#34; 401 Unauthorized&#34;以及类似于

的标题。
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());

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

enter image description here

您还可以在那里看到领域名称。 RFC 2617只是说明(关于realm):

  

境界:
   要显示给用户的字符串,以便他们知道用户名和    要使用的密码。该字符串应至少包含名称    执行身份验证的主机可能另外    指示可能具有访问权限的用户集合。一个例子    可能是&#34; registered_users@gotham.news.com"。