如何防止状态通过浏览器后退/前进按钮访问

时间:2016-12-21 14:09:45

标签: javascript angularjs angular-ui-router browser-history

我的应用有三种状态ABC。状态A要求进行身份验证。如果我们成功登录,则转到状态B(即A->b)。然后我们可以从该州迁移到C。但是,如果我们在状态C注销,我们会重定向到状态A,因为BC页面需要身份验证。但是,当我们按下浏览器后退按钮状态时,BC可以访问。我想从浏览器后退/前进按钮中删除这些状态。

我正在使用ui-router。我使用$stateChangeStart来识别那些需要身份验证并停止访问这些页面的页面。但是,该解决方案看起来并不正确。有没有办法使用历史管理或其他方式来做到这一点。

示例代码:

我的路线:

$stateProvider
    .state('account', {
            url: '/account',
            params: {isStateAuthorized: false},
            views: {
                'mainView@':{
                    templateUrl: 'pages/dashboard/dashboard.html',
                    controller: 'accountController' 
                }

            }
    })
    .state('account.accountDetails', {
            url: '/:accountType',
            params: {isStateAuthorized: false},
            views: {
                'mainView@':{
                    templateUrl: 'account/details/account-details.html',
                    controller: 'accountDetails'                       
                }
            }
    })
    .state('account.accountRegister', {
            url: '/:accountType/register',
            params: {isStateAuthorized: false},
            views: {
                'mainView@':{
                    templateUrl: 'account/registration/registration.html',
                    controller: 'registrationController'
                }
            }

    })

我还有其他一些路线,比如'登录'等等。

在.run方法中:

$rootScope.$on('$stateChangeStart', function(event, toState  , toParams, fromState, fromParams)
    {
        if(toState.params.isStateAuthorized === true && !$rootScope.isAppLog ) {
            event.preventDefault();
            $state.go('login');
        }
    });

Iam在每个州的isStateAuthorized使用params检查状态是否需要身份验证。

感谢。

1 个答案:

答案 0 :(得分:0)

我不确定ui-router中的事件是否支持与通用ui事件相同的API。

虽然可以使用状态更改事件来验证授权状态,并且如果状态不正确,则可以更改为其他状态,但它不是非常强大,并且可能会在历史记录中创建一些不需要的效果,例如。

更清洁的方法是使用州的resolve属性来确保存在授权。

$stateProvider.state('some_state_that_needs_auth', {
    ... other state properties ...
    resolve:{
        $state:'$state',
        authSvc:'authService',
        isAuthorized:function($state, authSvc){
            if( !authSvc.isAuthenticated() ){
                 $state.go('login');
            }
        }
    }
})