【问题标题】:GWT best way to implement admin consoleGWT 实现管理控制台的最佳方式
【发布时间】:2013-01-04 13:19:58
【问题描述】:

我正在创建一个 GWT 应用程序并希望添加一个管理控制台。

我的第一次尝试是创建一个管理窗口(小部件),然后在管理员登录时显示它。

这种方法的问题在于,每个访问我的页面的用户都会下载负责显示和操作管理控制台的 javascript——出于性能和安全原因,我不喜欢这个想法。

由于管理控制台只是我的应用程序中的一个“窗口”——我希望仅在用户以管理员身份登录时下载它,并在他注销时“​​清除”它。

我有哪些可用的选择来使用 GWT 实现这一目标?

【问题讨论】:

    标签: java security gwt web-applications web


    【解决方案1】:

    跟进 Ajax 的解决方案,更多细节和选项:

    • 您的管理模块是部署在不同战争中的不同 java 项目,例如 admin.war。
    • 您的 Admin java 项目继承自您的主项目,因此您拥有所有常用功能 + Admin 功能。
    • 您的管理模块 javascript 只能从 admin.war Web 应用程序访问,例如其中的 index.html。
    • 您的 admin.war Web 应用程序只能通过 ssl 隧道后面的本地主机访问。这样,只有那些可以使用私钥访问您的服务器的管理员用户在成功打开隧道后才能访问您的管理模块,其他人没有。此选项非常安全——您可以控制谁可以访问,并且所有通信都经过加密。但此选项仅适用于您只有少数管理员用户通过您的服务器授权的公钥对其进行严格控制的情况。否则,我想您必须通过密码和代码拆分来求助于上述身份验证机制。

    【讨论】:

      【解决方案2】:

      代码拆分是将管理内容从面向客户端的 JS 中移出的快速解决方案;但是,任何熟练使用 gwt 的人都知道如何访问未下载的代码拆分。

      真正安全的选择是运行第二个入口点并仅为管理员编译。这样一来,您的服务器就可以避免提供任何涉及管理功能的内容。

      将所有管理功能放入主编译中不允许的包中也是明智的;这样,您将永远不会泄露不安全的资源。

      【讨论】:

      • 让我检查一下我是否理解正确,我有一个主构建 - 这是每个客户正在加载的页面,当客户以管理员身份登录时,我会将他重定向到另一个页面看起来像普通用户页面,但带有管理控制台链接,这个页面实际上是一个不同的编译 gwt 模块,对吗?如果是这样,我怎么能不允许用户首先打开启用管理员的页面?
      • 是的,如果您想要第二个入口点包含第一个入口点中的所有内容,您需要更改您的第一个入口点以将除 <entry-point ...> 之外的所有内容放入不同的 .gwt .xml,比如说,Inherit.gwt.xml。因此,主入口点继承了 com.foo.Inherit,并添加了客户端入口点。 Admin入口点可以继承相同的公共模块,扩展客户端入口点,并添加管理功能。
      • 至于安全性,这取决于您的服务器环境。穷人的安全方法是在您的管理员入口点中设置一个陷阱。延迟调用应用程序加载,直到在文本字段中输入秘密密码。这将为您提供一些运行时安全性,尽管优秀的黑客可以查找您正在测试的字符串密钥。最好发送一个散列值。也就是说,使用某种字符串操作来混淆值。你甚至可以只使用一堆你 + 在一起的字符,这样整个密码就不会以纯文本形式供所有人查看。
      • 确实,您需要服务器端的安全性。如果您使用穷人版本,请至少在服务器上验证密码,而不是在客户端验证密码。 (再一次,发送未编码的密码对业务不利)。最好的办法是让页面本身通过 https 提供登录授权流程,该流程只会将管理页面提供给经过验证以管理员身份登录的人。您可以使用简单的 Web 表单自行创建,只需确保在通过网络发送密码之前对密码进行哈希处理,否则中间人将很容易获得访问权限。
      【解决方案3】:

      使用自己的 Activity 为管理控制台创建一个单独的视图。您可以为此使用Activities and Places design pattern

      此外,您可以使用code-splitting 确保只有管理员才能加载管理控制台所需的代码。

      编辑:

      在您的入口点类中,您应该检查用户是否经过身份验证并且是管理员,并允许或不允许访问您的应用程序的这一部分。你也应该在服务器端做同样的事情。当用户注销时,关闭应用程序。

      【讨论】:

      • 很好,但是当用户注销时如何强制加载的代码“清除”?我是否应该刷新所有页面 - 以便在没有管理部分的情况下再次下载代码?
      • 在您的入口点类中,您可以(并且应该!)检查用户是否经过身份验证并且是管理员,并允许访问您的应用程序的这一部分或不允许访问。你也应该在服务器端做同样的事情。当用户注销时,关闭应用程序。
      • 顺便说一下,当您刷新页面时,代码不会“再次下载” - 它被浏览器缓存。但是缓存这个管理代码并没有什么坏处——如果身份验证检查失败,它将无法访问/使用。
      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2010-11-28
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多