如何根据stateChangeStart的异步调用结果将用户重定向到未授权的页面?

时间:2013-12-08 02:02:25

标签: angularjs angular-ui-router restangular

我想要一个中心位置来检查用户是否有权导航到我的应用程序中的状态(例如,公司x的当前用户查看详细信息页面)。为每个解析器添加一行似乎有点乱,所以如果服务器说用户没有被授权导航到该状态,我正在考虑使用[ui-router]提供的stateChangeStart事件导航到未授权状态

这是resolve函数触发状态之前的“软检查”,以获取真实页面所需的数据(也是安全的)。

因此,对于与公司相关的州,我有一个我使用的端点,它返回一个布尔值:

/authorisationCheck?type=company&companyId=5&accessLevel=view

裸骨看起来像这样:

angular
    .module('app', [...])
    .controller('appController', function($rootScope){...})
    .config(function($stateProvider, $urlRouterProvider){...})
    .run(function($rootScope, $state) {

        $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {

            switch(toState.name) {
                case 'company.index':
                case 'company.details':

                    // user requires "view" permission for a company so check on the server
                    // I want this block to complete before the resolve function runs in the state being navigated to
                    Restangular.one('authorisationCheck')
                    .get({ type: 'company', companyId: toParams.companyId, accessLevel: "view" })
                    .then(function(result) {

                        if(!result.allowAccess) {
                            event.preventDefault(); // documented in ui-router to prevent transition
                            state.transitionTo('error.unauthorised');
                        }

                    });
                    break;

                default:
                    break;
            }

        });
    });

我的问题是这个检查使用了restangular,因此是异步的,所以当我正在进行访问时,检查toState中的resolve函数是否正在触发。我想阻止执行resolve函数,直到执行了访问检查。这可能吗?

1 个答案:

答案 0 :(得分:0)

我认为@caleb几乎已经在上面的评论中回答了你所寻找的内容,但有人认为我也觉得有用,而在这样的情况下,在拒绝请求之前要求提升权限,以便某人没有再次搜索路径,就像在Windows 7中,它会抛出一个密码对话框来检查我是否有正确的访问权限。当有人试图访问需要登录的深层链接网址时,它也很有用。

简短地讲述故事,您还可以查看following link,因为它允许呼叫在经过身份验证后继续执行请求的路径。