Javascript 用户界面路由器权限/访问控制

Javascript 用户界面路由器权限/访问控制,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我在决定如何向Angular应用程序添加权限/访问控制时遇到了很多麻烦。现在我们有: app.config(['$stateProvider', function ($stateProvider) { $stateProvider .state('default', { url: '', templateUrl: 'pages/home/view/home.html', controller: 'HomeCtrl

我在决定如何向Angular应用程序添加权限/访问控制时遇到了很多麻烦。现在我们有:

    app.config(['$stateProvider', function ($stateProvider) {

      $stateProvider

      .state('default', {
        url: '',
        templateUrl: 'pages/home/view/home.html',
        controller: 'HomeCtrl'
      })

      .state('home', {
        url: '/home',
        templateUrl: 'pages/home/view/home.html',
        controller: 'HomeCtrl',

        permissions: {                    // ?
          only: ['Admin','Moderator']
        },

        access: {                         // ?
         roles: ['*']
        },

        resolve: {                        // ?
          authenticate: function($state, $q, $timeout){

          },

        }

      })

}]);
我无法确定使用哪种方法来创建对每个页面的访问控制

现在,登录的用户存储在角度值中:

app.value('USER', JSON.parse('{{{user}}}'));
用户值包含有关用户具有哪些角色/权限的信息

但我无法将用户注入
app.config()
回调,它显示“未知提供者”


如何根据用户参数进行访问控制?

执行该操作的关键是在事件$stateChangeStart上添加访问控制

例如,如果您的路线是这样的:

      .state('termsofuse', {
            url: "/terms",
            templateUrl: "termOfUse.html",
            resolve: {
                authorizedRoles: function() {
                    return [USER_ROLES['su'],
                        USER_ROLES['user'],
                        USER_ROLES['admin'],
                        USER_ROLES['skysu']
                    ]
                }

            }

        })
您可以这样定义您的访问控制

.run(
            function($rootScope, $q, $location, $window, $timeout) {

                $rootScope.$on(
                    '$stateChangeStart',
                    function(event, next, current) {                      

                        var authorizedRoles = next.resolve.authorizedRoles();

//this function controls if user has necessary roles
                      if (!isAuthorized(authorizedRoles)) {

                            event.preventDefault();
      // and I broadcast the news                                                     $rootScope.$broadcast("AUTH_EVENTS.notAuthenticated"); 


                        } else {
$rootScope.$broadcast("AUTH_EVENTS.loginSuccess");


                        }

                    })



            });

然后,您只需定义事件的捕获器来管理所需的行为(重定向/错误消息或任何必要的行为)

执行该操作的关键是在事件$stateChangeStart上添加访问控制

例如,如果您的路线是这样的:

      .state('termsofuse', {
            url: "/terms",
            templateUrl: "termOfUse.html",
            resolve: {
                authorizedRoles: function() {
                    return [USER_ROLES['su'],
                        USER_ROLES['user'],
                        USER_ROLES['admin'],
                        USER_ROLES['skysu']
                    ]
                }

            }

        })
您可以这样定义您的访问控制

.run(
            function($rootScope, $q, $location, $window, $timeout) {

                $rootScope.$on(
                    '$stateChangeStart',
                    function(event, next, current) {                      

                        var authorizedRoles = next.resolve.authorizedRoles();

//this function controls if user has necessary roles
                      if (!isAuthorized(authorizedRoles)) {

                            event.preventDefault();
      // and I broadcast the news                                                     $rootScope.$broadcast("AUTH_EVENTS.notAuthenticated"); 


                        } else {
$rootScope.$broadcast("AUTH_EVENTS.loginSuccess");


                        }

                    })



            });

然后,您只需定义事件的捕获器来管理所需的行为(重定向/错误消息或任何必要的行为)

这就是我如何使其工作的。我不确定这是否是最好的方法,但它确实有效

无法在app.config()中插入服务/值,但可以将服务/值插入resolve.authenticate函数

我决定使用resolve.authenticate方法

 .state('home', {
    url: '/home',
    templateUrl: 'pages/home/view/home.html',
    controller: 'HomeCtrl',
    resolve: {
      authenticate: handlePageRequest['home']   // <<<<
    }
  })

我就是这样让它工作的。我不确定这是否是最好的方法,但它确实有效

无法在app.config()中插入服务/值,但可以将服务/值插入resolve.authenticate函数

我决定使用resolve.authenticate方法

 .state('home', {
    url: '/home',
    templateUrl: 'pages/home/view/home.html',
    controller: 'HomeCtrl',
    resolve: {
      authenticate: handlePageRequest['home']   // <<<<
    }
  })

您可能想签出,我将它与ui路由器一起使用。

您可能想签出,我将它与ui路由器一起使用。

app.value()
无法注入配置块。:。使用
app.constant()
insteadcool,这很好,但在这种情况下,使用resolve.authenticate,我们可以注入任何东西,因此不需要该解决方案tmk。如果您可以更新到UI Router 1.0,转换挂钩是实现这一点的最佳方法。当然,添加一个答案,我将向上投票
app.value()
无法注入配置块。:。使用
app.constant()
insteadcool,这很好,但在这种情况下,使用resolve.authenticate,我们可以注入任何东西,因此不需要该解决方案tmk。如果您可以更新到UI Router 1.0,转换挂钩是实现这一点的最佳方法。当然,添加一个答案,我将投票