java - 在 Grizzly 上使用 JaaS 和 Jersey

标签 java rest jersey jaas grizzly

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

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

就通过 HTTP 发送的内容而言,我认为存储 cookie 将是实现这一切的最简单方法。尽一切努力使身份验证垃圾远离我的 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 代码在某些点实际验证权限。我是否走在正确的轨道上?有更容易的方法吗?教程的链接将是一个很好的答案。即使是像“我这样做了并且有效”这样的答案也会让我感到温暖,我正在朝着正确的方向前进。

感谢您的帮助。

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

  • 您仍然想使用 servlet 过滤器来保护您的资源吗?我将使用任何可以将身份验证详细信息与 Jersey 代码分开的方法。它不一定是 servlet 过滤器。
  • “将其配置为使用 JaaS”是什么意思?最初的计划是使用 JaaS 来保护当前的 API。下一阶段是让整个 API 在线可用。在 API 调用周围使用 Jersey 包装器似乎是有意义的,但仍由 Grizzly 处理身份验证。我相信,到那时 Grizzly 就必须与 JaaS 进行交互。
  • 您是否认为应该有一些配置可以让 grizzly 保护您的资源?我正在考虑一个两步过程,对用户进行身份验证,并根据角色授权用户访问资源。这个想法是让 Grizzly 处理身份验证(使用 JaaS),让 Jersey 处理授权。
  • “我认为没有必要在 RESTful 资源中使用 cookie。”取消 cookie 的使用固然很好,但是如何才能实现呢?系统需要知道用户是否经过身份验证。我不想要求他们为每次通话传递用户名/密码等。即使在每次调用时都将 session token 作为参数传递似乎也“丑陋”。

另外,请注意,我对 REST 还很陌生。我从事 SOAP 工作已经有几年了,所以我可能有“SOAP 偏见”,这可能会让我看不到每个人都使用的一些明显、简单的解决方案。如果有更简单的方法,欢迎分享。我只是想尽可能多地学习。

最佳答案

我不太清楚“将其配置为使用 JaaS 进行身份验证”是什么意思。如果有一个简单的配置可以让 grizzly 强制执行 HTTP 身份验证保护 URL,我不知道。

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

至于过滤器本身,不幸的是,我不知道有一个预构建的 servlet 过滤器可以简单地将 JaaS 配置的登录模块插入到您的应用程序中,因此您可能需要在那里编写一些代码。不过这并不多,只需选择基于 HTTP 的身份验证方法(例如 HTTP BASIC、DIGEST 等),相应地从请求中提取凭据,然后使用 JaaS 框架登录即可。我不认为 RESTful 资源特别需要 cookie。 RESTful 架构风格不利于保持 session 。除此之外,还有很多关于 JaaS 的教程,因此我不会在这里详细说明。

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

无论如何,这个答案专门提供了有关使用 servlet 过滤器进行身份验证的更多详细信息,正如您在其他(链接的)问题中所要求的那样。这不一定是在 Jersey 网络应用程序中进行身份验证的唯一方法,但它是一种相当简单的方法。我喜欢它,因为它使我不必在每个需要它的资源中注入(inject)重复的身份验证代码。

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

关于java - 在 Grizzly 上使用 JaaS 和 Jersey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682061/

相关文章:

javascript - 了解 $resource 工厂和 @ 前缀

java - 用于无效 Json 字符串的 Jersey 自定义异常映射器

android - 如何在 Android 中实现 RESTFUL 服务?

没有 SSL 的 WCF 身份验证

java - 如何在 Java 中编写泛型方法以支持比较和算术运算

java - 使用java在xml中搜索结束排除

java - Jersey 客户端处理 JSON 数据

jaxb - Jersey + Moxy + JAXB - 如何在没有注释的情况下编码 XML

java - 与 Spring 集成的 PollableChannel

java - Jersey 第一次与第二次等待响应的时间差异