AngularJs授权布局

AngularJs authorization layout

我正在使用 Web API 和 AngularJs 构建一个大型应用程序。我使用身份验证和基于声明的授权构建了安全网络 api。一个要求是不同的用户可以在同一个模板上查看不同的模块。

我是 AngularJs 的新手。我在客户端使用令牌进行了身份验证。另外,在 web api 中,我创建了一个服务来获取给定用户 ID 的所有权限。响应是资源(控制器)/操作(方法)对的列表。如何根据客户端的授权规则实施正确的布局?这是否仅依赖于网络 api 权限响应和基于权限的 show/hide (ng-hide/ng-show) 内容?

这是一个好方法吗?我还需要研究哪些 modules/directives?例如加载器在用户请求父路由之前不加载嵌套路由。

为了增加复杂性,该站点还需要以双语工作。我认为 ng-translate。我之所以提到这一点,是因为它可能会引发另一场关于这是否有利于 MVC 而不是 AngularJs 的讨论。但如果能解决以上两个问题,优先Angular

正确的方法是根据服务器上的授权构建 AngularJS 路由配置。这应该在用户获得授权之后和 AngularJS 应用程序初始化之前构建。这样,授权用户会根据他的角色等看到 "complete" 应用程序。使用 ng-show/ng-hide 不是一个好方法。每个视图也应该只做一件事。因此根据需要完成的任务加载单独的视图。

关于多语言支持,这与Authorization无关。前段时间,我写了一个使用 jQuery i18next 插件的自定义 AngularJS 过滤器。这是一个非常简单的实现。

但是您现在可以使用 https://github.com/i18next/ng-i18next

(抱歉误会了问题)

我认为使用ng-hide/show不是什么大问题。归根结底,用户无权访问数据。我觉得应该是依赖api权限+show/hide的presentation。取决于您想要的复杂性...您可以将 MVC 与 angularjs 一起使用,因为它是一个大型应用程序。

所有的身份验证、授权和验证都应该在服务器端完成。您可以根据 roles/claims 服务器 告诉 当前用户使用的浏览器来调整用户界面。

实现此目的的一种方法是创建类似 roles/userprofile 控制器的东西,它将以当前用户拥有的角色列表作为响应。在客户端,您可能需要可以在任何地方注入的东西,这样您就可以确定用户界面的行为。

myApp.factory(‘myUser’, function(Roles, $q) {

  // Create a promise to inform other folks when we’re done.
  var defer = $q.defer();

    // For this example I’m using ngResource

    Role.query({
        /*
            No params — let the server figure out who you ‘really’ are.
            Depending on WebApi configuration this might just be 
            as simple as this.User (in context of the controller).
        */ 
    }, function(roles) {

        var user = {
            roles: roles,
            isInRole: function(role) {
                return user.roles.indexOf(role) !== -1;
            }
        };

        defer.resolve(user);
    });

    return defer;

});

因为上面的 factory 正在返回一个承诺,我们可以强制在创建某个 route/controller 实例之前解决 myUser。我使用的一个小技巧是将我所有的路由定义收集到一个对象中,使用 angular.forEach 循环遍历它们并向每个对象添加 resolve.myUser 属性。您也可以将其用于 pre-load/initialize 其他内容。

现在将 myUser 注入任何你喜欢的地方:

myApp.controller(‘MyController’, function($scope, myUser) {
  // Expose it on the current scope
  $scope.myUser = myUser;
}); 

... 在您的标记中...

<div class=“my-content-thingy”>
  <p>Lorem del ipsum …</p>
  <button class=“btn” ng-if=“myUser.isInRole(‘content-editor’)”></button>
</div>

注意:您可能想要使用 ng-if 而不是 ng-show;后者将元素保留在 DOM 中。

请记住,您不会在客户端验证任何东西;这一切都在服务器端完成。一种简单的方法是将 Authorize 属性放在适当的控制器操作上。

希望对您有所帮助。