如何将基本HTTP验证与REST Web服务(Java+Jersey)一起使用



我是REST Web服务的新手,刚刚创建了我的第一个Web服务
在我的服务中,用户可以通过简单的表格创建个人资料,给出他想要的用户名和密码。

现在如何在用户登录时检查用户凭据
我的意思是,我有一个简单的表单来验证用户是否登录,但当用户执行添加/更新/删除的各种配置文件操作时,如何验证用户??

例如:
在FB中,你登录后,它会存储一个cookie,其中包含你的凭据,当你执行"发布状态"等操作时,会给朋友发消息。。。等等…它不再要求您提供凭据,因为它有一个cookie,其中包含您的凭据,它只使用该cookie。。。

但是在REST中,我们不使用cookie,所以下一个选项是HTTP头。我想知道如何通过HTTP标头发送和接收用户凭据。即
Basic HTTP Auth

客户端

要将凭据发送到API,请使用HTTP Authorization标头,以Basic username:password的形式指定凭据。username:password字符串必须使用名为Base64的编码方案进行编码。因此,一个示例标头可能看起来像这样:

Authorization: Basic d2lraTpwZWRpYQ==

由于rest规范规定客户端-服务器通信应该是无状态的,因此必须在每个请求中包含带有凭据的标头。通常,您将在客户端使用会话cookie来识别用户,这样他就不必在每次请求时都输入凭据。

服务器端

要检查Jersey REST服务中的凭据,您需要捕获并拦截所有传入的请求。Jersey提供了一个名为ContainerRequestFilters的概念来实现这一点。例如,如果您使用Tomcat,您可以在web.xml中的servlet定义中添加这种类型的过滤器,如下所示:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>your.package.BasicAuthFilter</param-value>
</init-param>

被引用的类BasicAuthFilter需要实现Jersey ContainerRequestFilter接口并覆盖public ContainerRequest filter(ContainerRequest request)方法。在方法内部,您将基本上执行以下操作:

  • 从请求的Authorization标头中获取Base64编码的凭据
  • 解码它们(即使用javax.xml.bind.DatatypeConverter.parseBase64Binary()
  • 使用UserDao(或其他数据源提供程序)检查凭据是否有效
  • 如果验证失败,则返回状态代码401 Unauthorized(即throw new WebApplicationException(Status.UNAUTHORIZED)
  • 如果凭据有效,只需返回请求即可将其委派给负责处理该请求的Jersey Resource

你可以在这篇博客文章中找到一个很好的例子。

最新更新