使用JavaScript管理Web应用程序权限策略

3
我非常好奇不同开发人员通常用什么策略来管理用户对单页 Web 应用程序不同部分的权限策略。
仅举一个例子:在单页 Web 应用中,我指的是只有一个 HTML(JSP、PHP 或其他)页面作为入口点,并且所有其他客户端 UI 组件/页面均由 JavaScript 构建的 Web 应用。
是否有任何最佳实践、方法或框架可以使这些事情更加简单明了?
让我们举个例子:
- 有一个单页 Web 应用程序,其中包括 2 个标签页: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';

小组U3的用户现在拥有U1的权限,并且可以在单击A1时查看私人信息。 好的,他仍然无法看到由于初始条件而未呈现在页面上的那些组件。但是他仍然可以访问这些后期检查条件可用的功能。
老实说,我有点惊讶在网络上找不到与此问题相关的任何具体信息。我错过了什么吗? 如果有人能分享解决这类问题的经验,那将很有趣。
更新:当然,不应由U2 U3组的用户执行的所有操作也不会在服务器上执行,因为服务器上也有安全检查。例如,即使黑客能够在前端显示按钮或字段,该操作也不会在后端执行。但是我要寻找的是根本不给予在前端进行此类操作的机会。
1个回答

0

你不能使用JavaScript来处理权限或安全相关的事情:用户可以简单地打开浏览器控制台并编辑你的JavaScript。因此,这种方法是不可行的(除非你完全不关心)。

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

如果一个组件包含敏感部分,则需要找出一种方法将其拆分并根据用户发送不同版本到浏览器。

[编辑] 尝试找出一种将脚本拆分成较小部分(组件)的方法。ZK Framework 就是这样工作的:你有一个HTML组件框架(组件= JavaScript、HTML模板+ CSS),加上一个JavaScript核心,它加载组件并根据服务器准备的JSON配置进行配置。

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


据我所知,似乎没有人尝试过这样做,因为一开始这就是一个不好的想法。此外:您没有数百个不同的组件。20个文本字段仍然只是重复20次的相同组件。 - Aaron Digulla
好的,那么总结一下你的建议:例如在页面上的某个地方(比如抽象组件UserPanel上)应该有一个按钮,只有U1用户组的用户才能看到,那么就需要有两个UserPanel.js文件,一个带有按钮,另一个没有?根据你的建议,我能看到的另一个选项是在组件渲染后的AJAX请求回调中呈现按钮。另外,我的意思是指不仅仅是简单的字段,还包括自定义构建的用户界面小部件,如网格、面板、窗口、树等等。 - Dmitry B.
我也怀疑没有人尝试在客户端代码中管理权限 :) - Dmitry B.
2
AaronDigulla,我认为你没有理解单页应用程序的概念。当然,权限是在服务器上检查的。问题是如何使用户界面与权限匹配。这不是关于安全性,而是关于可用性。仅向客户端发送某些部分并不是SPA,而是MVC风格。想象一下你正在开发桌面应用程序,你会为每个用户组提供不同版本的可执行文件吗?那将是荒谬的... - Dominik
我同意@Dominik的观点,我认为像VueJs这样的SPA框架无法根据用户权限从后端传递不同的页面组件。 SPA的理念是避免为每个页面HTML调用后端,而只需为页面数据/内容调用后端。 - fudo
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接