gpt4 book ai didi

java - 在 Grizzly 上将 JaaS 与 Jersey 结合使用

转载 作者:行者123 更新时间:2023-11-30 07:38:38 27 4
gpt4 key购买 nike

我正在尝试寻找一种简单、灵活的方法来将 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 处理授权。
  • “我认为没有必要将 cookie 用于 RESTful 资源。”取消使用 cookie 会很棒,但如何才能实现呢?系统需要知道用户是否已通过身份验证。我不想让他们为每次通话传递用户名/密码/等。甚至在每次调用时都将 session token 作为参数传递似乎也很“丑陋”。

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

最佳答案

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

我假设您引用的其他问题和答案是您想要使用 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 webapp 中进行身份验证的唯一方法,但它是一种相当直接的方法。我喜欢它,因为它可以防止我在每个需要它的资源中注入(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com