【问题标题】:Role based access control of Mean stack web appMean stack web app的基于角色的访问控制
【发布时间】:2022-03-11 12:08:35
【问题描述】:

我正在开发一个平均堆栈 Web 应用程序,该应用程序包含基于登录用户角色的差异访问。有几个不同的角色,例如 admin、govt、volunteer 等。

1.如何根据角色管理前端?

目前我正在为每个角色设置全局标志,例如 isAdmin、isVolunteer、isGovt 等,并根据它们的值,我可以使用 data-ng-if = "Global.isAdmin" 显示不同的 UI

这种方法是否正确。如果不是,请建议处理 UI 的正确方法。

2。如果用户没有授权,如何管理后端并重定向路由?

目前我正在尝试使用 angular-permission 和 rbac 但仍然无法在我的应用程序中成功使用它们。 谁能告诉我平均堆栈网络应用程序基于角色的访问控制的最佳实践。

在尝试使用 angular-permission 时,我无法将创建的角色链接到路由文件。

这是角色模块。

angular.module('mean.users', ['permission'])
.run(['permission', 'Global', '$q',
    function(Permission, Global, $q) {
        console.log('not anonumous');
        Permission
            .defineRole('anonymous', function(stateParams) {
                var deferred = $q.defer();
                if (Global.user) {
                    deferred.resolve();
                } else {
                    deferred.reject();
                }
                return deferred.promise;
            })
            .defineRole('admin', function(stateParams) {
                if (Global.isAdmin) {
                    deferred.resolve();
                } else {
                    deferred.reject();
                }
                return deferred.promise;
            })
            .defineRole('govt', function(stateParams) {
                if (Global.isGovt) {
                    deferred.resolve();
                } else {
                    deferred.reject();
                }
                return deferred.promise;
            })
            .defineRole('volunteer', function(stateParams) {
                if (Global.isVolunteer) {
                    deferred.resolve();
                } else {
                    deferred.reject();
                }
                return deferred.promise;
            });

    }
]);

如何在路由文件中链接以上配置的角色

$stateProvider
        .state('create user', {
            url: '/users/create',
            templateUrl: 'users/views/create.html',
            resolve: {
                loggedin: checkLoggedin
            }
        })
        .state('all users', {
            url: '/users/list',
            templateUrl: 'users/views/list.html',
            data: {
                permissions: {
                     only: ['admin'],
                    redirectTo: 'home'
                }
            }
        })
        .state('show user', {
            url: '/users/:userId/view',
            templateUrl: 'users/views/view.html',
            resolve: {
                loggedin: checkLoggedin
            }
        })
        .state('edit user', {
            url: '/users/:userId/edit',
            templateUrl: 'users/views/edit.html',
            data: {
                permissions: {
                     only: ['admin']
                }
            }
        })
        .state('myprofile', {
            url: '/users/:userId/me',
            templateUrl: 'users/views/myprofile.html',
            resolve: {
                loggedin: checkLoggedin
            }

        });

【问题讨论】:

  • @JonSamwell 我想最好提供一个非常简短的答案,至少是概念性的,然后立即参考您的帖子;)

标签: angularjs node.js mean-stack role-based-access-control


【解决方案1】:

根据您的代码示例,我猜您正在使用 mean.io。

这是我在 mean.io 中的前端基于角色的访问控制的方法。

首先,我将角色添加到一些用户中,以便它们存在于数据库中并且我可以使用它们。

$ mean user a@example.com --addRole production
$ mean user b@example.com --addRole sales

然后,我有 2 条路线要添加到菜单中。在我的自定义模块的 app.js 中,我按角色过滤此路由,因此链接不会显示给其他角色:

Report.menus.add({
  roles: ['production'],
  title: 'Production reports',
  link: 'production reports'
});
Report.menus.add({
  roles: ['sales'],
  title: 'Sales reports',
  link: 'sales reports'
});

当然,这不足以限制前端的访问。您可以轻松指向http://localhost:3000/#!/report/sales,无论您是否担任销售角色,您都会看到销售报告。

诀窍在于我的自定义模块的 public/routes/report.js 文件,我在其中按角色过滤视图。

'use strict';

angular.module('mean.report').config(['$stateProvider',
  function($stateProvider) {
    // Check if user has role
    var checkUserRole = function(role, $q, $timeout, $http, $location) {
      // Initialize a new promise
      var deferred = $q.defer();

      // Make an AJAX call to check if the user is logged in and get user data including roles
      $http.get('/loggedin').success(function(user) {
        // Authenticated
        if (user !== '0' && (user.roles.indexOf(role) > -1 || user.roles.indexOf('admin') > -1)) $timeout(deferred.resolve);

        // Not Authenticated
        else {
          $timeout(deferred.reject);
          $location.url('/auth/login');
        }
      });

      return deferred.promise;
    };

    $stateProvider.state('report', {
      url: '/report',
      templateUrl: 'report/views/index.html'
    })
    .state('production reports', {
      url: '/report/production',
      templateUrl: 'report/views/production.html',
        resolve: {
          loggedin: function($q, $timeout, $http, $location) {
                return checkUserRole('production', $q, $timeout, $http, $location)
            }
        }
    })
    .state('sales reports', {
      url: '/report/sales',
      templateUrl: 'report/views/sales.html',
        resolve: {
          loggedin: function($q, $timeout, $http, $location) {
                return checkUserRole('sales', $q, $timeout, $http, $location)
            }
        }
    });
  }
]);

如果用户未经身份验证,他将被重定向到登录页面。如果他有错误的角色,他会被重定向到主页。

这种方法基于文章模块。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 2013-08-28
    • 2013-05-08
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多