我有一个基于GWT / SmartGWT的应用程序,该应用程序已部署在Google App Engine上。我正在使用基于XML的数据源。该文件对于所有用户而言都是应用程序正常运行所必需的。但是,我不希望非管理员用户能够通过在地址栏中指定其完整路径来直接查看或下载此文件。如下所述,我无法使用GAE的安全性约束(仅允许管理员访问),因为这会使应用程序对普通用户无用。

<security-constraint>
    <web-resource-collection>
        <url-pattern>ds/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>


因此,有没有一种方法可以阻止用户直接访问文件,但仍然允许他们通过应用程序使用它?

提前致谢。

更新(2011年5月3日):

我在多个XML文件中都有数据,并且所有数据都是只读的(仅获取,这些文件上没有添加/更新/删除)。我在使用此数据的客户端上有一些不同的功能。大多数时候,每种功能都有一个单独的数据源。在某些情况下,我使用SmartGWT小部件(例如ListGrid)进行数据绑定,而在其他情况下,我只是将数据转换为对象并在客户端上使用对象。

最佳答案

因此,该文件必须通过客户端代码(javascript)下载,但是您不希望用户看到它吗?

这无法完成-如果客户端上有数据,则可以对其进行访问。

解决方案是:


错误的解决方案:通过GWT-RPC公开此数据,而不是通过文件下载。 GWT-RPC很难进行逆向工程,因此“正常”的最终用户将无法简单地下载数据。但是,具有一定知识的用户将能够做到这一点,因此这不是保护敏感数据的解决方案。
正确的解决方案:仅向客户公开与给定用户相关的必要数据。使用GWT-RPC访问此数据,如果还有其他非GWT客户端,则使用REST。不要公开任何敏感数据。这基本上迫使您在服务器上而不是在客户端上实现业务逻辑。这是正确的事情。


更新:

您仍应secure the servlet

<security-constraint>
    <web-resource-collection>
        <url-pattern>/profile/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

10-01 05:04
查看更多