【问题标题】:Web application, JAX-rs , Jax-rs client, servlets, Rest webservicesWeb 应用程序、JAX-rs 、Jax-rs 客户端、servlet、Rest webservices
【发布时间】:2016-12-06 10:44:16
【问题描述】:

我正在使用 jax rs 开发一个带有 Rest 服务的 Web 应用程序(servlets、jsp)。在 Web 应用程序 UI 中,我在 servlet 的帮助下通过 jaxrs 客户端调用这些 Web 服务(servlet 调用 jax-rs 客户端,客户端反过来调用 Web 服务)。同时我正在公开这些 Web 服务。

现在我正在尝试添加身份验证、授权,这样当通过 Web UI(HTML、Servlets、jax-rs 客户端)调用这些 Web 服务时,不应该进行任何检查。但是当直接通过浏览器 url 或一些插件(如高级 rest api、邮递员)调用 web 服务时,它应该显示身份验证错误。我怎样才能做到这一点

简而言之 - 如何区分对这些 Web 服务的直接 Web 服务调用和 UI 调用。

提前致谢

【问题讨论】:

  • 基本上:你不能。可以将 Postman 请求设置为与特定浏览器发送的请求完全相同。 Push 是为了推动来自特定客户端机器的请求;您无法控制该客户端计算机上的哪个软件发送了请求。您也不应该关心,您想要验证和授权客户端,而不是软件。

标签: java rest jsp servlets jax-rs


【解决方案1】:

如果我理解正确,您想区分来自系统内部的“内部”调用与来自 Internet 的“外部”调用。

您可以添加HTTP basic authentication。它基本上是一个 HTTP 标头,其中包含在 HTTP 到达 Web 服务器时验证的用户 + 密码。发起对 REST 服务的调用的 servlet 可以添加带有预定义凭据的 HTTP 标头。这不仅提供了身份验证,您还可以为不同的用户设置不同的授权级别。

有几个库支持此功能(身份验证+授权)我正在使用Apache Shiro,它还包含cookie形式的会话管理

注意:您应该注意 HTTP 基本身份验证标头是加密的。它依赖于安全的 HTTP 连接(即 HTTPS)来保证安全。

编辑:在评论中提出问题后: 尽管官方不支持它,但您可以拥有多个指向同一个 REST 服务的 URI 路径(实际上就像在同一个类或方法上指定多个 @Path 注释一样) 诀窍是利用正则表达式,有关详细信息,请参阅此问题Can we have more than one @Path annotation for same REST method

所以,假设您有指向 sme REST 服务的 /path1 和 /path2,您可以定义仅在 /path1 上调用的身份验证过滤器

【讨论】:

  • 感谢 sharonbn 回答了我的问题。
  • 到目前为止,我正在使用 servlet 过滤器进行基本身份验证,所以无论是从浏览器调用 Web 服务还是在 UI 中单击按钮,我都会调用此过滤器。问题如果我从任何插件 postman..etc 调用,我可以在标题中添加用户名和密码并可以进行身份​​验证。但如果调用是在内部进行的(在 Ui 中单击按钮等),那么我在请求中没有此授权标头(例如:当我尝试登录应用程序时)。如何处理这个问题。@sharonbn
  • 首先,您可以使用简单的js脚本将标题添加到登录页面。如果您希望没有标题,您可以让多个路径指向同一个服务,但仅将过滤器应用于其中一个
  • 能否请您详细说明“多条路径指向同一个服务,但仅将过滤器应用于其中一个”
  • 我指的是这个堆栈溢出问题。但问题是我必须调用 REST API 而不是从调度程序触发 servlet,以及我如何处理这个无限循环,有什么方法可以实现这个stackoverflow.com/q/2725102/5615132
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多