JavaScript 客户端应用程序中的权限/ACL

Posted

技术标签:

【中文标题】JavaScript 客户端应用程序中的权限/ACL【英文标题】:Permissions/ACL in a JavaScript Client Side App 【发布时间】:2013-06-11 18:34:39 【问题描述】:

如果我有一个 javascript 前端应用程序,处理权限/ACL 的最佳/常见做法是什么。例如,我想显示/隐藏一些元素等。当然,它不安全,但仍然在视图层,我该如何控制它。

我使用 BackboneJS (with Marionette) 作为客户端框架,所以使用 jQuery、Underscore 等。

我正在考虑高层,我可以尝试以某种方式禁用某些路由。需要一些研究,但我可以做Router.on("route", checkPermissions)

然后在视图层上,隐藏/显示元素,......仍然不确定如何最好地处理这个问题。我需要将一些权限对象传递给模型...

【问题讨论】:

【参考方案1】:

为了使元素在屏幕上隐藏/可见,我在模板中进行内联检查,例如:

<% if (user.isInRole('ADMIN', 'MNGR'))  %>
    <li <% page == "store" ? print('class="active"') :'' %>>
    </li>
<%  %>

并在我的用户模型中添加了以下帮助函数来检查权限:

isInRole: function (rr) 
    var self = this;
    $.each(rr, function(i) 
        if (rr[i] === self.currentRole) 
            alert('pass');
        
    );

我认为这是足够安全的,因为对所需权限的实际检查再次发生在服务器端。通过隐藏一些控件,我只是在引导用户完成应用程序,而不是让他与操作混淆,因为他/她没有所需的权限。

使用这种方法,我从不隐藏通过 REST 服务动态传入的数据,只隐藏页面的静态元素。

【讨论】:

【参考方案2】:

我将创建自定义 BaseModel/BaseCollection 类,并使用修改后的解析逻辑从数据层删除不可访问的属性。稍后您将能够将此数据隐藏逻辑透明地传输到服务器端并获得生产价值的安全性。

对于权限数据,Model/Collection 类上的_security 属性将是声明它的好地方。

在视图中,按照 akoskm 的建议使用条件逻辑

【讨论】:

在客户端解析敏感数据属性是个坏主意。如果用户无权查看敏感数据,甚至不应该离开服务器。

以上是关于JavaScript 客户端应用程序中的权限/ACL的主要内容,如果未能解决你的问题,请参考以下文章

华为无线AC基本设置

Javascript不能做什么?

没有 GET_ACCOUNTS 权限的 Android 中的 Google Cloud Endpoints + GoogleApiClient

权限系统的设计模式 ACL RBAC ABAC

RBAC的禁止翻墙访问

权限体系解析 功能&数据