【问题标题】:Angularjs role based routing errorAngularjs基于角色的路由错误
【发布时间】:2016-01-15 01:21:45
【问题描述】:

我正在尝试使用此https://github.com/Narzerus/angular-permissionbeeman's loopback-angular-admin repo 中实现基于角色的授权

所以我正在尝试将users.config.js 更改为这样 -

(function () {
  'use strict';
  angular.module('com.module.users')
    .run(function ($rootScope, gettextCatalog, Permission, AppAuth, User) {
      $rootScope.addMenu(gettextCatalog.getString('Users'), 'app.users.list', 'fa-user');
      Permission.defineRole('anonymous', function (stateParams) {
        // If the returned value is *truthy* then the user has the role, otherwise they don't
        return !AppAuth.hasOwnProperty('currentUser');
      });
      Permission.defineRole('student', function (stateParams) {
        // If the returned value is *truthy* then the user has the role, otherwise they don't
        AppAuth.ensureHasCurrentUser(function () {
          //This call also serves to redirect a user to the login screen, via the interceptor in users.auth.js, if they are not authenticated.
          console.log(User.getCurrent());
          return !!(User.getCurrent().hasOwnProperty('role') && User.getCurrent().role == 'student');
        });
      }).defineRole('tutor', function (stateParams) {
        // If the returned value is *truthy* then the user has the role, otherwise they don't
        AppAuth.ensureHasCurrentUser(function () {
          //This call also serves to redirect a user to the login screen, via the interceptor in users.auth.js, if they are not authenticated.
          console.log(User.getCurrent());
          return !!(User.getCurrent().hasOwnProperty('role') && User.getCurrent().role == 'tutor');
        });
      });
    });

})();

所以基本上我是在具有以下代码的 AppAuth 模块的帮助下定义我的角色 -

(function () {
  'use strict';

  /*jshint sub:true*/
  /*jshint camelcase: false */

  angular
    .module('com.module.users')
    .factory('AppAuth', function ($cookies, User, LoopBackAuth, $http) {
      var self = {
        login: function (data, cb) {
          LoopBackAuth.currentUserId = LoopBackAuth.accessTokenId = null;
          $http.post('/api/users/login?include=user', {
            email: data.email,
            password: data.password
          })
            .then(function (response) {
              if (response.data && response.data.id) {
                LoopBackAuth.currentUserId = response.data.userId;
                LoopBackAuth.accessTokenId = response.data.id;
              }
              if (LoopBackAuth.currentUserId === null) {
                delete $cookies['accessToken'];
                LoopBackAuth.accessTokenId = null;
              }
              LoopBackAuth.save();
              if (LoopBackAuth.currentUserId && response.data && response.data
                  .user) {
                self.currentUser = response.data.user;
                cb(self.currentUser);

              } else {
                cb({});
              }
            }, function () {
              console.log('User.login() err', arguments);
              LoopBackAuth.currentUserId = LoopBackAuth.accessTokenId =
                null;
              LoopBackAuth.save();
              cb({});
            });
        },

        logout: function (cb) {
          //Destroy the access token.
          User.logout({"access_token": LoopBackAuth.accessTokenId}, function () {
            //Destory both cookies that get created.
            delete $cookies["access_token"];
            delete $cookies["accessToken"];
            //Perform the Passport Logout
            $http.post('/auth/logout');

          });
          self.currentUser = null;
          cb();
        },

        ensureHasCurrentUser: function (cb) {
          if ((!this.currentUser || this.currentUser.id === 'social') && $cookies.accessToken) {
            LoopBackAuth.currentUserId = LoopBackAuth.accessTokenId = null;
            $http.get('/auth/current')
              .then(function (response) {
                if (response.data.id) {
                  LoopBackAuth.currentUserId = response.data.id;
                  LoopBackAuth.accessTokenId = $cookies.accessToken.substring(
                    2, 66);
                }
                if (LoopBackAuth.currentUserId === null) {
                  delete $cookies['accessToken'];
                  LoopBackAuth.accessTokenId = null;
                }
                LoopBackAuth.save();
                self.currentUser = response.data;
                var profile = self.currentUser && self.currentUser.profiles &&
                  self.currentUser.profiles.length && self.currentUser.profiles[
                    0];
                if (profile) {
                  self.currentUser.name = profile.profile.name;
                }
                cb(self.currentUser);
              }, function () {
                console.log('User.getCurrent() err', arguments);
                LoopBackAuth.currentUserId = LoopBackAuth.accessTokenId =
                  null;
                LoopBackAuth.save();
                cb({});
              });
          } else {
            if(self.currentUser){
              console.log('Using cached current user.');
            }
            cb(self.currentUser);
          }
        }
      };
      return self;
    });

})();

然后在我正在做的路线文件中 -

$stateProvider
        .state('router', {
          url: '/router',
          template: '<div class="lockscreen" style="height: 100%"></div>',
          controller: 'RouteCtrl'
        })
        .state('error', {
          url: '/error',
          template: '<div class="text-center alert alert-danger" style="margin: 100px">An error occurred.</div>'
        })
        .state('app', {
          abstract: true,
          url: '/app',
          templateUrl: 'modules/core/views/app.html',
          controller: 'MainCtrl',
          data: {
            permissions: {
              only: ['admin', 'student']
            }
          }
        })
        .state('app.home', {
          url: '',
          templateUrl: 'modules/core/views/home.html',
          controller: 'HomeCtrl',
          data: {
            permissions: {
              only: ['admin', 'student']
            }
          }
        })
        .state('tutor', {
          abstract: true,
          url: '/tutor',
          templateUrl: 'modules/core/views/app.html',
          controller: 'MainCtrl',
          data: {
            permissions: {
              only: ['admin', 'tutor']
            }
          }
        })
        .state('tutor.home', {
          url: '',
          templateUrl: 'modules/core/views/home.html',
          controller: 'HomeCtrl',
          data: {
            permissions: {
              only: ['admin', 'tutor']
            }
          }
        });
      $urlRouterProvider.otherwise('/router');

但现在我在浏览器控制台中收到以下错误 -

Error: undefined role or invalid role validation
    at Object.Permission._findMatchingRole (angular-permission.js:170)
    at Object.Permission.resolveIfMatch (angular-permission.js:211)
    at Object.Permission.authorize (angular-permission.js:239)
    at angular-permission.js:45
    at Scope.$broadcast (angular-scenario.js:24081)
    at Object.transitionTo (angular-ui-router.js:3229)
    at Array.<anonymous> (angular-ui-router.js:2346)
    at Object.invoke (angular.js:4185)
    at handleIfMatch (angular-ui-router.js:1836)
    at angular-ui-router.js:1891

那么我该如何调试这个错误或在我的环回应用程序中实现基于客户端角色的授权

【问题讨论】:

    标签: angularjs permissions authorization loopbackjs strongloop


    【解决方案1】:

    [..] 在我的环回应用中实现基于客户端角色的授权

    这并不意味着什么,环回是你的服务器应用程序。

    应该禁止客户端授权,因为客户端可能被篡改。

    授权应仅在服务器端进行。在客户端,您应该只根据角色的功能调整内容。这样,如果有人篡改您的客户端代码,至少它对 API 的 http 请求将失败,您的数据是安全的

    【讨论】:

    • 我正在做服务器端授权,但我想为每个模块的不同类型角色创建单独的视图
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2015-07-17
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多