Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时控制对GWT代码的访问_Java_Security_Google App Engine_Gwt - Fatal编程技术网

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

Java 在运行时控制对GWT代码的访问,java,security,google-app-engine,gwt,Java,Security,Google App Engine,Gwt,我的GWT应用程序(2.1.0)允许用户选择不同的数据组合方法。它们可以求平均值,找到方差,等等。我通过指定使用哪种方法的枚举来实现这种效果 现在我想为单个客户机编写自定义方法。例如,有人可以请求模式功能 一种解决方案是将模式添加到枚举中,编写getMode()函数,然后将其添加到应用程序中。这个问题来自10000个自定义选项。我不介意编写10000个不同的方法,但我不希望所有10000个函数都发送到每个客户机。事实上,我想确保一个客户端看不到另一个客户端方法的实现,该方法可能包含私有数据 ru

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

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

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

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

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

我希望这是清楚的。谢谢你的指点

在测试中包装
runAsync()
调用

if (testPermission()) {
  GWT.runAsync(...);
}
或者,如果你想打电话到某个服务

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

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

如果您真的关心源代码的安全性,我会将您的私有算法实现保留在服务器上。有人可以很容易地查看您的源代码(尽管已混淆),并下载任何延迟的源代码(也已混淆)

如果使用延迟绑定(runAsync),则在main.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中,请查看本文

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

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

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


如果它存在,请按此处所述使用apply调用它

,但由于在这种情况下testPermissions在客户端上,因此任何人都可以跳过该代码,直接下载代码,对吗?如果他们遇到了问题,可以。正如pulazzo所说,如果你不希望未经授权的用户能够下载源文件,你需要在服务器上强制执行,要么拒绝访问JS文件,要么移动逻辑服务器端。不幸的是,代码需要在客户端,因为它运行了几百次。我真的需要做一些事情,比如检查特定片段的权限。可能这仍然是最好的答案——检查特定片段的权限可能过于笨拙,不值得费心!您能用纯Javascript实现算法并通过JSNI调用它们吗?如果对你有效,我可以建议一种方法。不管怎样,我会发布它。其他人可能会发现它很有用。这似乎是最好的解决方案。谢谢