Angular Js 安全问题基于角色的授权

Posted

技术标签:

【中文标题】Angular Js 安全问题基于角色的授权【英文标题】:Angular Js Security Issues Role Based Authorisation 【发布时间】:2014-11-04 07:00:36 【问题描述】:

我正在为我的公司在 Angular 中创建一个新的企业应用程序。我对 Angular 感到非常兴奋,但在客户端处理角色并不适合我。

基本上,我会在用户登录时保存令牌,在用户查看页面之前,会向服务器发送授权请求以根据令牌获取角色和用户详细信息。

在授权请求获取页面数据到服务器后,无论用户的角色如何,服务器都会返回整个数据,之后我使用 ng-switch 并根据角色呈现模板。

现在的问题是我试图在客户端显示和隐藏数据,因此在收到用户信息后,我必须将角色保留在客户端的某个范围变量或本地存储中。但我的观点是,如果我将其保留在客户端,我可以非常轻松地更改角色并访问我想要的任何数据。

所以我应该假设 Angular 不适合我的应用程序,我试图根据服务器的角色在客户端显示数据,因为我觉得如果用户可以看到你的逻辑和数据,他显然可以玩用它。

这是我的观点

   <div ng-switch="User.data.Role">
       <div ng-switch-when="Admin">
            <h1>hello you are seeing your dashboard Admin</h1>
        </div>

        <div ng-switch-when="Manager">
            <h1>hello you are seeing your dashboard Manager</h1>
        </div>
    </div>

这是我在控制器中填充用户变量的方法

app.controller('dashoBoardController',  ['$scope','UserService', function ($scope, UserService) 

    $scope.authentication = UserService.authentication;
    $scope.User = UserService.fillAuthData();
    console.log($scope.User);
    $scope.Greeting = "Welcome! to your Dashboard";



]);

这是服务方法

   var _fillAuthData = function () 

        var authData = SessionService.get('user');

        if (authData) 
            _authentication.isAuth = true;
            _authentication.data = authData;

        

        console.log(_authentication);
        return _authentication;
    

会话服务基于令牌从服务器获取用户数据。 正如您所看到的,由于视图是如此具有描述性,因此更改 authData 中的角色并不是什么大问题。

如果有解决此问题的方法,请帮助我。我真的很想在 Angular 中做这个项目。

【问题讨论】:

作为一般规则,服务应该只发回用户有权查看的数据。换句话说,安全应该由服务而不是客户端来处理。 【参考方案1】:

如果 Web 服务(在服务器上运行)向客户端返回经过身份验证的用户无权访问的数据,则 Web 服务(服务器端)存在安全漏洞。无论您决定选择哪个客户端框架,都无法修复该客户端/浏览器端。 AngularJS 可能适用于您想在浏览器中执行的任何操作,但您的 Web 服务已损坏。

【讨论】:

感谢您的及时回复..但是我们尝试发送未经授权的数据的唯一原因是因为我们不想在服务器上做所有繁重的工作,而是我们想做客户端上的所有繁重操作,以便我们的 API 可以使用更通用的方法花费更少的时间,因为呈现 JSON 比进行数据库调用更快。你认为在 asp.net 中创建具有淘汰赛和 MVC 的应用程序会更有效吗使用相同的 API 逻辑,我们可以在那里有更好的安全控制? 不行,如果你所指的Web服务器的API逻辑有安全漏洞,那么切换到另一个浏览器端框架将无法修复它。一个不错的浏览器调试器甚至会向您显示网络响应(服务器返回的明文 JSON),包括您希望隐藏的数据(例如,Chrome -> 网络选项卡中的 CTRL+SHIFT+J)。 在这里投反对票。我认为这个问题在这种情况下是有效的,因为它与角色有关。服务器是否返回它不应该返回的数据并不重要。即使不是,如果您在模板中使用角色说“如果用户是管理员,则会显示此内容”,那么很容易将自己操纵为管理员并查看管理员所看到的内容。问题当然是,如果数据丢失,那会怎样。但无论如何我都感到不安。【参考方案2】:

我同意 nomve,服务器端的安全不是这里的问题。服务器端的安全应该永远是安全的最后一道门,并且应该始终非常小心地实施。

但是,能够在客户端破解角色并看到用户不应该看到的界面,即使没有从服务器获取数据,这并不是最好的体验。

每次远程检查角色并且不将角色存储在本地可以解决问题,但需要成本。是否有一种本地方法来加密角色信息并使在客户端破解角色变得更加困难?

【讨论】:

以上是关于Angular Js 安全问题基于角色的授权的主要内容,如果未能解决你的问题,请参考以下文章

如何通过数据库的LDAP和基于角色的授权实现Spring安全?

我们如何确保 Angular.js 的安全性

基于 ROLES 的 Spring 安全授权不起作用

Spring Security - 角色和 ACL 安全性是不是矫枉过正?

Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权

调用 Azure Functions 的静态 Angular 应用程序。是安全问题吗?