防止授权失败时UI-Router状态执行但仍然激活它

时间:2015-01-27 17:44:14

标签: angularjs authentication angular-ui-router

在我的主模块run方法中,我的代码如下:

$rootScope.$on('$stateChangeStart', function(event, toState, toParams) {
    if (toState.data && toState.data.access && !Authentication.authorize(toState.data.access, toState, toParams)) {
        event.preventDefault();

        $modal.open({
            templateUrl: 'components/security/login.html',
            controller: 'LoginCtrl as ctrl',
            backdrop: 'static',
            keyboard: false,
            size: 'sm',
            resolve: {
                reason: function() {
                    return false;
                }
            }
        });
    }
});

基本上,当您导航到状态并且未经过身份验证时,会弹出一个模态窗口(从API收到401时会发生同样的情况)。

在登录模式中是指向注册表单的链接。除了这些步骤外,一切正常:

  • 打开网站www.example.com /.
  • " home"状态(/)受保护,因此授权检查失败,因此执行此代码:event.preventDefault()并弹出模式。
  • 用户点击"注册"链接:登录模式关闭,他访问www.example.com/signup。这一切都还可以。
  • 现在,当您按下浏览器中的后退按钮时,授权检查会再次启动并阻止状态更改,因此网址会保留在www.example.com/signup。
  • 当用户登录登录模式关闭并且状态加载但问题是:他仍然处于注册状态而不是/(主页)。

所以问题当然是event.preventDefault()根本不会改变状态,因为没有依赖于登录用户的代码运行。但我真正需要的是它进入状态但实际上并没有执行它,如果这是有道理的。然后按后退按钮只会返回主页,登录模式会再次弹出。然后,当您登录时,您处于正确的状态(主页)。

0 个答案:

没有答案