在运行时控制对GWT代码的访问

时间:2011-01-23 20:14:08

标签: java security google-app-engine gwt

我的GWT app(2.1.0)允许用户选择不同的数据组合方法。它们可以平均,找到方差等。我使用枚举来实现这种效果,该枚举指定使用哪种方法。

现在我想为各个客户端编写自定义方法。例如,有人可以请求MODE功能。

一种解决方案是将MODE添加到枚举,编写getMode()函数,并将其添加到应用程序。问题在于10,000个自定义选项。我不介意编写 10,000种不同的方法,但我不希望所有10,000个函数都被发送到每个客户端。实际上,我想确保一个客户端无法看到另一个客户端方法的实现,该方法可能包含私有数据。

GWT.runAsync可以帮助我将所有这些方法拆分成不同的块,只有在用户请求时才会下载。有没有办法在下载该代码之前运行某种权限检查?例如,我不希望有人更改其枚举指定首选项的值来欺骗(私有)代码进行下载。

我在java GAE上运行它。我可以在下载cachedjs文件之前编写一个过滤器来进行权限检查,但由于GWT文件的名称在每次编译后都会发生变化,我无法想到以一种有意义的方式控制对不同块的访问。

我希望这很清楚。感谢您的任何指示!

2 个答案:

答案 0 :(得分:1)

如果您真的担心源代码的安全性,我会将您的私有算法实现保留在服务器上。有人可以轻松查看您的来源(虽然是混淆)并下载任何延迟来源(也是混淆)。

如果您使用延迟绑定(runAsync),您将在主.cache.html文件的顶部看到类似的内容:

// spacing modified for readability
var $strongName = '02F159CD1F48EEB372B36E0BA704A0BE';
function __gwtStartLoadingFragment(frag) {
    return $moduleBase + 'deferredjs/'  + $strongName + '/' + frag + '.cache.js';
}

考虑到这一点,可以确定下载延迟代码源的路径。如果您的服务器允许它(因为检查特定片段的权限可能很难),它将被提供。

如果您将代码保留在服务器上,则可以在返回结果之前创建rpc服务并检查服务器上的权限。如果您不想拥有一堆服务方法,请使用调度方法的名称和计算数据创建一个。


如果您需要在客户端上运行算法,则可以通过RPC服务动态提供代码并在客户端上执行eval()来更轻松地保护代码。这需要在Javascript而不是GWT中实现您的算法(其余代码仍然是GWT)。

1)创建一个服务器实现的服务方法,如下所示:

public String getAlgorithmCode(String name) {
    // locate the code. store it in a file, database, cache it in memory, etc.
    // ...
    return javascriptSourceCode;
}

2)将javascript加载到页面中。由于你只是在GWT代码中使用它,你可以在当前帧中eval()它,但如果你想将它加载到$ wnd,请查看这篇文章。

http://blog.lexspoon.org/2009/03/many-scopes-of-javascripts-eval.html

如果使用相同的命名约定和函数签名编写javascript实现,则可以使用JSNI调用它。

3)当需要调用此方法时,您可以检查函数是否已定义。

如果它不存在,请使用该服务获取它。

如果存在,请使用此处Calling dynamic function with dynamic parameters in Javascript

所述的方式调用它

答案 1 :(得分:0)

在测试中包裹runAsync()来电。

if (testPermission()) {
  GWT.runAsync(...);
}

或者,如果您想要拨打服务

myService.testPermissions(user, new AsyncCallback() {
  @Override
  public void onFailure(Throwable caught) {
    ...
  }

  public void onSuccess(Boolean hasPermission) {
    GWT.runAsync(...);
  }
});