当前位置: 首页 > 知识库问答 >
问题:

确保泽西岛的Rest服务

梁季
2023-03-14

我对web服务非常陌生。我已经公开了一些使用与Spring集成的Jersey 2的REST服务。现在我需要使用用户名/密码身份验证来保护那些rest服务。我被告知不要使用Spring Security。

我不知道该怎么做。我确实在网上搜索了一下,但是各种链接显示了不同的实现方式,我无法决定如何进行。

共有1个答案

林和煦
2023-03-14

使用用户名和密码进行身份验证的常用方法是使用基本身份验证。基本上,客户端需要发送一个请求头authorization,头值为basic Base64Encoded(username:password)。因此,如果我的用户名是peeskillet,而我的密码是pass,那么作为客户端,我应该将头设置为

Authorization: Basic cGVlc2tpbGxldDpwYXNz

servlet环境中,容器应该支持基本身份验证。您可以在web.xml上配置这种支持。您可以在Java EE教程的48.2保护Web应用程序中看到一个示例。在一个示例中,您还会注意到

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

这是为了支持SSL。对于基本身份验证,建议使用此方法。

过滤器的基本流程如下所示

>

  • 获取授权标头。如果不存在,则抛出authenticationexception。在这种情况下,authenticationExceptionMapper将发送头“www-authenticate”,“Basic realm=\”“+e.getRealm()+”\“,这是基本身份验证协议的一部分

    一旦我们有了头,我们解析它只是为了得到Base64编码的用户名:password。然后我们解码,然后拆分,然后分离用户名和密码。如果此过程中的任何一个失败,则再次抛出WebApplicationException,它映射到一个400 Bad请求。

    检查用户名和密码。示例源代码只是检查用户名是否为user,密码是否为password,但您需要使用筛选器中的某些服务来验证此信息。如果其中一个失败,则抛出authenticationexception

    如果一切顺利,将从authenticate方法创建user,并将其注入authorizer(即SecurityContext)。在JAX-RS中,securitycontext通常用于授权`。

    对于授权,如果您希望为某些资源保护某些区域,您可以为类或方法使用@rolesAllowed注释。通过注册RolesAllowedDynamicFeature,Jersey支持此注释。

    实际上,将从请求中获取securitycontext。在我链接到的示例中,您可以看到authorizer,它有一个重写的方法IsUserInRole。将调用此方法以对照@rolesallow({“admin”})中的值进行检查。因此,创建securitycontext时,应确保在重写的方法中包含用户的角色。

    对于测试,您可以简单地使用浏览器。如果一切都设置正确,当您尝试访问该资源时,您应该会看到(在Firefox中)一个如本文所示的对话框。如果你使用卷曲,你可以

    C:/>curl -v -u username:password http://localhost:8080/blah/resource
    

    这将发送一个经过身份验证的基本请求。由于使用了-v开关,您应该可以看到涉及到的所有头。如果您只是想使用客户端API进行测试,您可以在这里看到如何设置它。在提到的三种情况中的任何一种情况下,Base64编码都将为您完成,因此您不必为此担心。

    至于SSL,您应该查看容器的文档,了解如何设置它。

  •  类似资料:
    • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

    • 我有一个基于Jersey的Rest服务在tomcat服务器上运行。没有UI,只是一个提供一些rest服务的服务器。现在,要访问这个服务,我必须输入的URL相当长。类似于,其中MyApp是我部署的webapp,url_pattern是我在web.xml中的servlet映射中定义的模式,classPath和method分别是类和方法的@path注释。有没有可能缩短它,这样我就可以去掉这个URL的My

    • 问题内容: 我有一个Jersey REST API,并且正在使用来处理授权。我还在所有端点上使用,以便我的API可以处理数千个并发请求。 我的授权过滤器命中了一个远程服务,但是当运行过滤器时,Jersey尚未将当前线程添加到它的内部,因此我完全失去了异步的好处。 我可以告诉Jersey我希望这是异步的吗? 这是一个示例资源: 更新 刚刚收到泽西队球员的回音,从2.7开始,这是不可能的。只有资源方法

    • 我很难理解泽西岛的注入机制。JAX-RS规范(http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005)指出,在应用程序子类、根资源类和提供程序中可以通过@Context进行注入。 我现在有一个在启动时实例化的类,并且有一个在每次请求时调用的方法。在方法内部,我需要访问当前的UriInfo对象。问题是,这个方法不是从我的

    • 我正在泽西岛2中编写一个RESTful网络服务。我想支持响应的 Gzip 编码。按照这个答案,我在我的类中启用了。 在我的资源类中,我返回一个对象。 现在,当我点击这个api时,我得到一个响应,但响应头不包含头,而是包含 header。 请求: 响应: 响应中没有 标头,也没有任何标头。 我在上使用。 我还遗漏了其他配置吗?我如何获得这两个头并得到gzip压缩的响应,而不是接收分块的响应? 编辑:

    • 问题内容: 我在Glassfish上有一个工作正常的JavaEE 6 Web应用程序,该应用程序已经具有JSF前端并具有其身份验证机制((使用基于CDI和注释的安全性),因此有一个登录屏幕,用户输入用户名密码,按登录按钮和Java EE身份验证过程开始。 现在,我想“还将”我的一些服务类公开为REST服务(我可能会使用Jersey),因此也可以从移动设备访问它。但是让我担心的是登录部分。 我将使用