在Grizzly上使用JaaS和泽西岛

我正在尝试找到一种简单,灵活的方法来向REST添加JaaS身份validation。 我找到了一篇post ,我认为这个post引导我走向正确的方向(参见StevenC的回答)。 听起来servlet容器负责安全性,而不是Jersey代码本身。 我喜欢这个想法,但需要一点实施指导。

Grizzly是我的servlet容器,我想将其配置为使用JaaS进行身份validation。 现在,一个简单的用户名/密码组合就可以了,直接在代码中硬编码用户名/密码对就可以了。 只要它使用JaaS,我们就可以在以后细化这些细节。

至于通过HTTP发送的内容,我认为存储cookie将是使这一切全部工作的最简单方法。 无论如何使身份validation垃圾远离我的Jersey代码。

以下是到目前为止启动Grizzly的代码:

final String baseUri = "http://localhost:9998/"; final Map initParams = new HashMap(); initParams.put("com.sun.jersey.config.property.packages", "my.jersey.Service"); System.out.println("Starting grizzly..."); SelectorThread threadSelector = GrizzlyWebContainerFactory.create(baseUri, initParams); System.out.println(String.format( "Jersey app started with WADL available at %sapplication.wadl\n" + "Try out %shelloworld\nHit enter to stop it...", baseUri, baseUri)); System.in.read(); threadSelector.stopEndpoint(); System.exit(0); 

如果整个过程有效,那么检查用户权限的最佳方法是什么? 我可能希望我的REST代码在某些点实际validation权限。 我是否走在正确的轨道上? 有更容易的方法吗? 指向教程的链接将是一个很好的答案。 即使像“我这样做而且有效”这样的答案也会给我一个温暖的模糊,我正朝着正确的方向前进。

谢谢你的帮助。

编辑:对StevenC评论的一些澄清:

  • 您是否仍希望使用servletfilter来保护资源? 我将使用任何可以从Jersey代码中分离出身份validation详细信息的内容。 它不必是servletfilter。
  • 什么是“配置它使用JaaS”的意思? 最初的计划是使用JaaS保护当前的API。 下一阶段将是在线提供整个API。 在API调用周围有一个Jersey包装器似乎是有道理的,但是保持身份validation由Grizzly处理。 我相信Grizzly必须与JaaS互动。
  • 您是否认为应该有一些配置只会导致灰熊保护您的资源? 我正在考虑对用户进行身份validation和基于角色的两步流程,授权用户访问资源。 我们的想法是让Grizzly处理身份validation(使用JaaS)和Jersey处理授权。
  • “我认为不需要使用RESTful资源的cookie。” 删除cookie的使用会很棒,但如何实现呢? 系统需要知道用户是否经过身份validation。 我宁愿不要求他们为每个电话传递用户名/密码/等。 甚至在每次调用时都将会话令牌作为参数传递似乎“丑陋”。

另外,请注意我是REST的新手。 我已经做了几年SOAP,所以我可能会有一个“SOAP偏见”,这可能会使我从一个每个人都使用的明显,简单的解决方案中眩目。 如果有更简单的方法,请随时分享。 我只是想尽可能多地学习。

我并不完全清楚“将其配置为使用JaaS进行身份validation”的含义。 如果有一个简单的配置让灰熊强制执行HTTP身份validation保护URL,我不知道它。

我假设从另一个问题并回答你的参考,你想使用servletfilter。 通常,这是在servlet项目的web.xml文件中配置的。 Grizzly当然经常用于从代码启动服务器而不是应用程序配置。 当我以这种方式使用grizzly时,我注意到GrizzlyWebContainerFactory没有提供允许你指定servletfilter的任何版本的create()。 但是我确实注意到同一个项目中的ServletAdapter [1]确实能够为你提供这种能力。

至于filter本身,遗憾的是我不知道预先构建的servletfilter只是将JaaS配置的登录模块插入到您的应用程序中,因此您可能不得不在那里编写一些代码。 不过,只需选择基于HTTP的身份validation方法(例如HTTP BASIC,DIGEST等),相应地从请求中提取凭据,然后使用JaaS框架登录。 我没有看到RESTful资源特别需要cookie。 RESTful建筑风格在保持会话时皱眉。 有很多关于JaaS的教程,所以我不会在这里详细说明。

一旦JaaS主题处于活动状态(消费者成功登录),您就可以使用Subject.getSubject方法获取当前主题并检查活动主体和凭据。

无论如何,这个答案专门用于提供有关使用servletfilter执行auth的更多细节,正如您在其他(链接)问题中所要求的那样。 这不一定是在jerseywebapp中进行身份validation的唯一方法,但这是一种相当简单的方法。 我喜欢它,因为它阻止我在每个需要它的资源中注入重复的auth代码。

[1] https://grizzly.dev.java.net/nonav/apidocs/com/sun/grizzly/http/servlet/ServletAdapter.html

不确定您是否在询问如何保护每个资源,但我发现了一个关于javapassion的演示文稿,听起来就像您正在寻找的那样。 他说使用@Context SecurityContext作为参数。

  @Path("basket") // Sub-resource locator could return a different resource if a user // is a preferred customer: public ShoppingBasketResource get(@Context SecurityContext sc) { if (sc.isUserInRole("PreferredCustomer") { return new PreferredCustomerShoppingBaskestResource(); } else { return new ShoppingBasketResource(); } }