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

标签 java security google-app-engine gwt

我的 GWT 应用程序 (2.1.0) 允许用户选择不同的数据组合方法。他们可以求平均值、求方差等。我通过指定要使用哪种方法的枚举来实现此效果。

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

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

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

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

我希望这一点很清楚。感谢您的指点!

最佳答案

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

如果您使用延迟绑定(bind) (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)当需要调用该方法时,您可以检查该函数是否已定义。

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

如果存在,请按照此处所述使用 apply 来调用它 Calling dynamic function with dynamic parameters in Javascript

关于java - 在运行时控制对 GWT 代码的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4776220/

相关文章:

java - 使用触摸屏运行 java swing

java - Eclipse 中的项目文件组织

Java JDialogs之间如何传递信息?

php - 如何在PHP中密码保护pdf

java - 从 Java 中的谷歌计算引擎与数据存储和云存储通信

Java 子列表无序排列组合

security - Grails 如何处理安全性,我为什么要使用插件?

javascript - 仅使用 JavaScript 检查文件是否存在于本地

python - AppEngine urlfetch validate_certificate=False/None 不被尊重

python - App Engine、appcfg 和保存上传凭据