【问题标题】:Controlling access to GWT code at runtime在运行时控制对 GWT 代码的访问
【发布时间】:2011-01-25 08:11:08
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java security google-app-engine gwt


    【解决方案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) 调用这个方法的时候,可以检查一下函数是否定义好了。

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

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

    【讨论】:

    • 不幸的是,代码需要在客户端上,因为它运行了数百次。我真的需要做一些事情,比如检查特定片段的权限。可能这仍然是最好的答案 - 检查特定片段的权限可能太笨重,不值得麻烦!
    • 你能用纯Javascript实现你的算法并通过JSNI调用它们吗?如果适合您,我可以建议一种方法。
    • 无论如何我都会发布它。其他人可能会觉得它很有用。
    • 这似乎是最好的解决方案。谢谢!
    【解决方案2】:

    在您的测试中封装runAsync() 调用。

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

    或者,如果您想调用服务

    myService.testPermissions(user, new AsyncCallback() {
      @Override
      public void onFailure(Throwable caught) {
        ...
      }
    
      public void onSuccess(Boolean hasPermission) {
        GWT.runAsync(...);
      }
    });
    

    【讨论】:

    • 但是由于在这种情况下 testPermissions 在客户端,任何人都可以跳过该代码并直接下载代码,对吧?
    • 如果他们遇到麻烦,是的。正如 pulazzo 所说,如果您根本不希望未经授权的用户能够下载源文件,则需要在服务器上强制执行该操作,方法是拒绝访问 JS 文件或移动逻辑服务器端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2015-03-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多