【问题标题】:Authentication and Session management with Apache CXF DOSGi使用 Apache CXF DOSGi 进行身份验证和会话管理
【发布时间】:2013-06-19 12:09:13
【问题描述】:

我有一个使用 cxf DOSGi [1] 的客户端 - 服务器应用程序。现在我想从服务器验证客户端并为客户端创建一个会话。客户端将有一个 cookie,用于在通过身份验证后访问服务。我想知道服务器访问 HTTP 会话的最佳方式是什么,以及在经过身份验证后在客户端存储 cookie 的最佳方式。

我正在考虑在经过身份验证后在应用程序级别创建一个自定义 Session 对象并将 Cookie 对象发送到客户端。所以当客户端访问服务方法时,它会将cookie作为参数传递。客户将在每种服务方法中进行验证。但我不认为这是处理这个问题的最佳方式,因为每个服务方法都必须有一个单独的参数来传递 Cookie。

我在谷歌搜索 [2] 时遇到了这个问题。是否可以在 DOSGi 的服务中获取“WebServiceContext”?即使我得到它,我将如何将 cookie 存储在客户端并确保客户端在每个后续 Web 服务调用中发送 cookie?

[1]http://cxf.apache.org/distributed-osgi-greeter-demo-walkthrough.html

[2]How can I manage users' sessions when I use web services?

非常感谢任何帮助。 谢谢。

【问题讨论】:

  • 您需要会话来创建有状态服务,还是只想使用它来维护身份验证?如果只是身份验证,为什么不简单地为每个呼叫使用基本身份验证?
  • 我不想要有状态的服务。要求是对用户进行身份验证并只允许授权用户访问服务。要为每次调用使用基本身份验证,客户端必须在每次访问服务方法时传递一个用户令牌。我怎么做? DOSGi 有可能吗,因为 AFAIU 我无法从 OSGi 级别获取 Web 服务请求信息?

标签: java session authentication cxf dosgi


【解决方案1】:

您可以使用自定义意图来控制身份验证。基本上,意图是 DOSGi 应用于 Web 服务的 CXF 功能。您在单独的包中创建该功能,然后使用其名称的特殊属性发布它:请参阅DOSGi reference guide

在一个项目中,我们创建了一个功能,该功能读取包含身份验证上下文的 threadlocal,并使用存储在那里的凭据来填充 CXF 身份验证。因此,您只需在应用程序启动时将凭据存储一次到 threadlocal 中,所有调用都可以正常工作。

目前还没有针对这种情况的简单文档或示例,但我计划在不久的将来创建它,因为身份验证是一个常见问题。我计划使用 shiro 作为身份验证框架并为 CXF 编写一个通用适配器。准备好后,我会添加评论或其他答案。与此同时,您可以尝试自己做同样的事情。

【讨论】:

  • 感谢您的回答。我有一个问题。客户端如何通过某个令牌发送其身份验证信息?服务器如何在身份验证阶段提取该信息?
  • 在最简单的形式中,您使用拦截器将用户名和密码设置为 CXF 中的消息属性,以便获取 http 传输身份验证。在服务器端,您必须安装一个拦截器来评估凭据并允许或拒绝访问服务。
  • @ChristianSchneider 嗨,Christian,您为什么决定使用 Shiro 而不是将 JAAS 与 JAASLoginInterceptr 一起使用?
  • 在我们的项目中,我们使用了一个 jaas 登录拦截器,因为客户决定使用带有 kerberos 的单点登录。我计划使用 Shiro 的部分原因是它很好地支持在切换线程时传递登录信息,例如执行人。此外,它听起来比 jaas 更简单。另一方面,我对 shiro 的第一次实验还可以,但并不比 jaas 简单得多。所以我还是有点不确定哪种方法最好。
  • 我收到了更新。在 karaf 邮件列表中,我们讨论了如何对 karaf 命令和 OSGi 服务进行身份验证。我们同意默认使用 JAAS。所以我也会把它添加到 CXF 中。见karaf.922171.n3.nabble.com/…
猜你喜欢
  • 2015-05-22
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多