【问题标题】:Manage web-application permission policies with JavaScript使用 JavaScript 管理 Web 应用程序权限策略
【发布时间】:2015-03-18 10:12:34
【问题描述】:

我非常想知道通常使用什么策略来管理不同开发人员对单页 Web 应用程序不同部分的用户权限策略。

仅举一个例子:在 单页 Web 应用程序下,我的意思是 Web 应用程序只有一个 HTML(JSP、PHP 等)页面作为入口点,并构建了所有其他客户端 UI 组件/页面使用 JavaScript)。

是否有任何最佳实践、方法或框架可以让这件事变得更加简单明了?

举个例子:

  • 有一个带有 2 个选项卡的单页 Web 应用程序:A 和 B
  • 每个选项卡都有 3 个组件(网格、按钮等):A1、A2、A3 和 B1、B2, B3
  • 有 3 个用户组:U1、U2 和 U3
  • U1 可以访问两个选项卡和所有组件
  • U2 可以访问两个选项卡,但只能访问组件 A1 和 B1
  • U3 只能访问选项卡 A 和此选项卡中的所有组件

表面上的一个解决方案是在页面加载时(或使用单独的 AJAX 请求)构建一个全局 JS 对象并将用户组存储在那里。然后在代码中使用条件来验证当前组并允许或限制特定功能。一个简化的示例如下所示:

index.html

<script type="text/javascript">
    window.onload = function() {                
        MyApplication = {
            userGroup : 'U3' // can be also U1 or U2. This value comes from server
        };
    }
</script>   

然后在代码中我们将进行如下检查:

if (MyApplication.userGroup == 'U1') {...}
if (MyApplication.userGroup == 'U1' || MyApplication.userGroup == 'U2') {...}
if (MyApplication.userGroup != 'U3') {...}

该示例可以扩展为根据用户组以不同方式处理事件的场景。 假设 A1 是按钮,A1OnClickHandler 是它的点击处理程序:

var A1OnClickHandler = function() {
    if (MyApplication.userGroup == 'U1') {
        console.log('A very private information'); 
    } else if (MyApplication.userGroup == 'U2') {
        console.log('Less private information'); 
    } else if (MyApplication.userGroup == 'U3') {
        console.log('Public information'); 
    }
}

我描述的方法的一个缺点是可能会在呈现页面后由用户动态更改 MyApplication.userGroup 的值。只需打开控制台并输入:

MyApplication.userGroup = 'U1';

Bingo,组 U3 的用户现在拥有 U1 的权限,将能够查看 A1 点击的私人信息。 好的,他仍然无法看到那些由于初始条件而没有在页面上呈现的组件。但在这些后检查条件之后,他仍然可以访问可用的功能。

老实说,我对无法在网络上找到与此问题相关的任何具体信息感到有些惊讶。我想念什么吗? 如果有人可以分享自己解决此类问题的经验,那将是很有趣的。

更新:当然,所有不应该由组 U2 U3 的用户执行的操作都不会在服务器上执行,因为服务器上也有安全检查。例如,即使黑客能够在前端显示按钮或字段,该操作也不会在后端执行。但我正在寻找的是根本不给机会在前端做这种事情。

【问题讨论】:

    标签: javascript web-applications single-page-application user-permissions usergroups


    【解决方案1】:

    您不能将 JavaScript 用于与权限或安全相关的任何事情:用户只需打开浏览器控制台并编辑您的 JavaScript。所以这种方法是行不通的(好吧,除非你根本不在乎)。

    正确的解决方案是在服务器上实现安全性,并且仅将那些组件发送到特定用户(您通过某种登录方式识别)可以根据存储在服务器上的权限实际查看/使用的浏览器。

    如果一个组件包含敏感部分,那么你需要想出一种方法来拆分它并将不同的版本发送到浏览器,这取决于用户。

    [编辑] 尝试找出一种方法将脚本拆分为更小的部分(组件)。 ZK Framework 的工作方式如下:您有一个 HTML 组件框架(组件 = JavaScript,HTML 模板 + CSS)加上一个 JavaScript 核心,它根据服务器准备的 JSON 配置加载组件并配置它们。

    这样,您可以在 PHP 中构建 UI 结构,将其转换为 JSON,然后将其发送到将使用此“配置”呈现 UI 的客户端。这些组件将是可重用的,并且对于所有客户端都是相同的。根本不需要在客户端检查权限,因为客户端代码永远不需要知道。

    【讨论】:

    • 感谢您的意见!是的,我完全同意服务器上的安全检查是最可靠和最理想的方式。我还指出,用户可以打开控制台并更改 JS 代码或变量的值。但是,如果应用程序非常复杂并且具有数百个组件和数千个事件,那么从服务器发送所有自定义组件可能会成为一项非常具有挑战性的交易。所以不知道有没有什么技巧和方法可以处理客户端代码的部分权限。
    • @DmitryB.:据我所知,没有人尝试过这个,因为一开始感觉是个坏主意。另外:您没有数百个不同的组件。 20 个文本字段仍然只是重复 20 次的同一个组件。
    • 好的,那么总结一下您的建议:例如,如果页面上的某处(假设在抽象组件 UserPanel 上)应该有一个按钮,该按钮应该只对 U1 组的用户显示,那么应该有UserPanel.js 文件的 2 个副本,一个带有按钮,另一个没有?根据您的建议,我可以看到的另一个选项是在组件渲染后从 AJAX 请求的回调中渲染按钮。附言同样对于组件,我的意思不是简单的字段,而是自定义构建的用户 UI 小部件,如网格、面板、窗口、树等。
    • 我也怀疑没有人尝试过在客户端代码中管理权限:)
    • AaronDigulla,我认为您不了解单页应用程序的概念。当然权限是在服务器上检查的。问题是如何使用户界面与权限相匹配。这不是关于安全性,而是关于可用性。仅向客户端发送某些部分不是 SPA,而是 MVC 风格。想象一下,您正在开发一个桌面应用程序,您是否要为每个用户组提供不同版本的可执行文件?那太荒谬了……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2012-01-05
    • 1970-01-01
    • 2022-01-01
    • 2017-06-19
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多