我对web服务非常陌生。我已经公开了一些使用与Spring集成的Jersey 2的REST服务。现在我需要使用用户名/密码身份验证来保护那些rest服务。我被告知不要使用Spring Security。
我不知道该怎么做。我确实在网上搜索了一下,但是各种链接显示了不同的实现方式,我无法决定如何进行。
使用用户名和密码进行身份验证的常用方法是使用基本身份验证。基本上,客户端需要发送一个请求头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),因此也可以从移动设备访问它。但是让我担心的是登录部分。 我将使用