使用AngularJS的防弹ACL

时间:2015-11-19 00:45:19

标签: angularjs acl

我是AngularJS的新手,并试图掌握实施访问控制层的概念,以便某些页面/菜单对某些用户隐藏。

我通常在后端(PHP / MySQL)上实现ACL和所有路由,但是这个项目要求我只在客户端执行所有操作。

我们有一个负责身份验证的远程服务器,成功登录后会返回is_admin标志,以便我知道是否显示其他信息。

虽然不太可能,因为Angular也是渲染引擎并负责所有逻辑,我担心用户将能够使用浏览器开发工具和/或其他第三方工具并获得对这些区域的访问权限(因为浏览器中的所有脚本和逻辑都是可见的)。

所以,如果我这样做:

     if (user.is_admin === true) 
        {
            //display the additional admin data...
        }

用户可以在浏览器工具中设置user.is_admin = true并获得访问权限。

使用PHP等服务器端呈现,用户将永远无法了解这些隐藏区域。即

    <?php 
       if ($user->is_admin === true) {...}//user will never ever see that or be able to modify $user properties
    ?>

当然,服务器将继续对每个请求进行身份验证,因此此漏洞只允许有限的访问,但似乎仍然是隐藏某些用户的部分的非安全方式。

我是否遗漏了Angular中的某些内容,或者是否有更好的方法可以帮助客户端黑客攻击它?

1 个答案:

答案 0 :(得分:1)

隐藏部分的Angular方式使用ng-if/ng-show/ng-hide指令,如:

<div ng-if="is_admin">...</div>

您无法隐藏那些查看来源的人或您在应用中提供的资源。所以不要为这些视图提供管理数据。

我的方法是制作一个“管理”应用程序以及“标准”应用程序和它们之间的链接。这样,暴露的唯一内容就是指向管理站点的链接,这些链接被非管理员用户阻止:

<div ng-if="is_admin"><a href="/admin/#/link">Link</a></div>

/admin/*页面的所有请求如果不是管理员,则会返回401状态代码。 REST资源还会根据需要返回401状态代码。

(修改:在ng-hide上方更改为ng-if以取消生成的DOM中的div。)