2012-03-29 40 views
1

我正在创建一个使用Drupal 7内容管理系统的Web应用程序。网页大量使用JQuery和AJAX。如何使用Drupal保护Java REST服务?

AJAX调用命中REST服务,这实际上是使用JAVA实现的。 Apache运行Drupal 7,并且配置为将任何对REST URL的调用传递给Java EE服务器(Jboss AS7)。一切都在SSL。

我需要授权和认证对REST服务的调用,并从Java应用程序访问当前登录到Drupal的用户的用户名或ID。问题是...如何...

由于AJAX调用是对同一个Apache服务器(而不是一个单独的服务器等),一切都发生在同一个http会话内,所以我希望这会很容易。

事情我已经深思熟虑的:

  • 配置调用自定义一个java安全拦截器(本地 只访问)Drupal的服务,不知怎的,读取会话ID和 返回登录用户名
  • 创建一个“愚蠢的”drupal REST服务充当所有REST调用的网关,授权/认证然后在传递到Java后端服务之前注入用户名
  • https://lists.wisc.edu/read/messages?id=7777296#7777296的文章让我想知道是否我可以逃脱机智h调用一个Drupal服务(仅在每个Java服务会话开始时),它接受一个Drupal会话ID并返回当前用户及其角色。我可以在我的Java服务中对其进行配置,以便每隔x秒或y调用一次该调用以检查角色更改或注销。

其他人如何做到这一点?这一定是一个常见的问题来解决是不是?如果不是的话,你会怎样做,而不是通过AJAX安全地访问已验证的服务?除了Drupal之外,我不想介绍第二个用户控制过程,除非它是不可避免的。 DRY :)

谢谢 - 这让我难住!

回答

1

看看你在做什么,并尽量保持事情尽可能简单,我会去第一个选项的变化。这基本上是当前的node.js模块所做的,尽管它具有唯一的授权令牌。工作流程是这样的:

  1. 当用户登录加载页面时,会生成并存储在Drupal数据库独特的令牌,并当浏览器去连接到节点发送到浏览器
  2. .js服务器发送身份验证令牌连同请求
  3. node.js服务器在第一次接收带有令牌的请求时,将连接到Drupal站点上的Web服务并验证令牌是否有效,发回有关用户的任何信息,以及他们拥有哪些角色/等等。
  4. 然后,node.js服务器将内部存储用于将来的请求,以便它不必为每个请求ping Drupal站点。
  5. 当用户注销Drupal时,Drupal向node.js服务器发出直接请求,要求它删除该用户的令牌。

听起来像基本上交换你的Java应用程序的节点。这应该是非常可行的,如果将来将其分割为多个服务器,它的优点是可以很好地扩展。

+0

这很有道理。是否有可能使用存储在标题或cookie中的会话变量作为唯一标记,以消除对额外标记的需求? – user1180316 2012-04-04 09:33:51